2010-08-03 4 views
1

J'ai parcouru diverses ressources et je n'arrive pas à comprendre comment faire une opération plutôt simple.Division d'une liste

En ce moment, j'ai une liste comme suit:

li = [['a=b'],['c=d']] 

Je veux le transformer en:

li = [['a','b'],['c','d']] 

Si je comprends bien, split("=") applique uniquement aux types de chaînes. Existe-t-il une méthode équivalente pour les listes?

Pardon la simplicité de ma question ...

-Dan

+3

Les éléments des listes sont des chaînes ... vous ne voulez pas diviser la liste. Vous voulez diviser les chaînes. –

+0

J'ai le sentiment que vous utilisez une mauvaise structure de données. Je ne peux pas m'empêcher de voir votre liste comme dictionnaire: {'a': 'b', 'c': 'd'} –

Répondre

0

Attention - sa fait un moment que je l'ai fait tout python, mais votre question est plus générale.

Vous avez raison en ce que la division s'applique aux chaînes.

Ce que vous devez faire est diviser la valeur contenue dans votre liste pas la liste elle-même.

Alors vous feriez quelque chose comme

newValue = split('=', li[0][0]) 
li[0] = newValue 
3

Vous pouvez utiliser map():

>>> li = [['a=b'],['c=d']] 
>>> map(lambda x: x[0].split('='), li) 
[['a', 'b'], ['c', 'd']] 

Cette parcourt la liste li et applique la fonction lambda à chaque élément. Comme chaque élément de la liste est à nouveau une liste avec un élément, x[0] prend cet élément, qui est une chaîne, le divise et renvoie une nouvelle liste avec les deux valeurs.

10

Vous voulez ceci:

[x[0].split('=') for x in li] 
# prints [['a', 'b'], ['c', 'd']] 

pour saisir une question d'un commentaire plus bas du poste, la division raison fonctionne pour x [0] est que x représente la liste intérieure. C'est accompli par le for x in li. Aussi, j'ai fixé le mien pour lire for x in li et non for x in test car j'avais assigné vos exemples à une variable appelée «test» sur mon système.

+0

Cela ne fonctionne que si chaque liste interne n'a qu'un seul élément. – chryss

+1

La même chose est vraie pour les réponses qui suggèrent la carte, la clé étant qu'ils utilisent x [0] pour obtenir la chaîne dans la liste interne. Si le PO a des exemples plus compliqués de ses listes imbriquées, les solutions peuvent être revues, mais cela répond à la question posée. –

+0

Cela fonctionnera quel que soit le nombre d'éléments: '[x [i] .split ('=') pour x dans li pour i dans la plage (len (x))]' –

0

Est-ce ce que vous cherchez? map(lambda y:y.split('='),map(lambda x:x[0], li))

0

présumant chaque sous-liste se compose de chaînes individuelles de la forme a=b: (. En effet, ce que vous partagez est la chaîne intérieure a=b Ainsi, la méthode de chaîne split() fonctionne très bien.)

>>> [el[i].split('=') for el in li for i in range(len(el))] 
[['a', 'b'], ['c', 'd']] 

EDIT: Une façon beaucoup plus élégante de faire cette double liste de compréhension est:

>>> [a.split('=') for el in li for a in el] 
[['a', 'b'], ['c', 'd']] 

Il y a eu un certain nombre de bonnes suggestions faites, donc l'OP devrait être capable d'apprendre une bonne quantité de Python pour cela. Il est important de se rappeler que ce qui est divisé est li [i] [j], c'est-à-dire un élément de la liste qui est un élément de la liste li.

+0

'range (len (el))' est faux! Ce qui suit est plus simple: '[val.split ('=') pour el in li pour val dans el]' –

+0

Euh, j'ai déjà ajouté cela longtemps avant de commenter. Aussi, pourriez-vous élaborer sur «faux»? – chryss

+0

Comme vous l'avez démontré dans votre montage, il existe un moyen plus simple d'obtenir le même résultat. Par conséquent, je dirais que la première version est «fausse». –

0

Vous pouvez le faire avec ceci:

[k[0].split("=") for k in li] 
+0

Cela ne fonctionne que si chaque liste interne n'a qu'un seul élément. Ma solution suppose que si elle a plusieurs éléments, ils ont tous la forme indiquée. – chryss

+1

@chryss: Je ne suppose pas cela. Si oui, le PO devrait clarifier. –

+0

Pourquoi split fonctionne-t-il sur k [0] et pas lui-même? Est-ce que k n'est pas une liste ici aussi? – Dan