2010-12-01 7 views
2

J'aurais besoin d'utiliser la fonction de carte en Python (2.4.4) pour ajouter 1 à chaque élément de la liste, donc j'ai essayé de convertir les chaînes en entiers.Comment utiliser la fonction de carte sur des listes imbriquées et convertir des chaînes en entiers?

line=[['10', '13\n'], ['3', '4\n'], ['5', '3\n'], ['1', '13']] 

map(lambda X:(X+1),int(line)) 

Est-ce ne fonctionne pas à cause de \n et les nids?

+1

Eh bien, voici l'erreur que je reçois: 'TypeError: int() l'argument doit être une chaîne ou un nombre, pas 'list'' – chrisaycock

+1

Vous devez parcourir les listes dans la liste, au lieu de simplement la première liste (qui a des membres de type list). –

Répondre

4

Eh bien votre intention n'est pas claire mais elle n'est pas due à \ n.

Voir:

>>> line=[['10', '13\n'], ['3', '4\n'], ['5', '3\n'], ['1', '13']] 
>>> map(lambda X:([int(X[0])+1, int(X[1]) +1]),line) 
[[11, 14], [4, 5], [6, 4], [2, 14]] 
+0

Cette méthode a du sens. Merci. – Carter

6

J'utiliseriez une compréhension de la liste, mais si vous voulez map

map(lambda line: map(lambda s: int(s) + 1, line), lines) 

La compréhension de la liste serait

[[int(x) + 1 for x in line] for line in lines] 



>>> lines=[['10', '13\n'], ['3', '4\n'], ['5', '3\n'], ['1', '13']] 

>>> map(lambda line: map(lambda s: int(s) + 1, line), lines) 
[[11, 14], [4, 5], [6, 4], [2, 14]] 

>>> [[int(x) + 1 for x in line] for line in lines] 
[[11, 14], [4, 5], [6, 4], [2, 14]] 
+0

Cela fonctionne bien aussi. Merci. – Carter

1

Conversion des chaînes avec des sauts de ligne à un nombre entier n'est pas un problème (mais int("1a") serait ambigu, fo Par exemple, Python ne le permet pas).

La correspondance dans votre code passe une sous-liste à la fonction lambda, l'une après l'autre. Par conséquent, vous devez parcourir à nouveau les listes internes:

>>> line = [['10', '13\n'], ['3', '4\n'], ['5', '3\n'], ['1', '13']] 
>>> print map(lambda sublist: map(int, sublist), line) 
[[10, 13], [3, 4], [5, 3], [1, 13]] 

Pour augmenter par un, il serait aussi simple que ci-dessus:

map(lambda sublist: map(lambda x: int(x)+1, sublist), line) 
+0

Une autre bonne approche. – Carter

1

en utilisant l'argument du déballage.

pairs=[['10', '13\n'], ['3', '4\n'], ['5', '3\n'], ['1', '13']] 
[[int(x) + 1, int(y) + 1] for x, y in pairs] 

Une boucle, pas de lambda.

+0

Merci, mais une carte était nécessaire. – Carter

Questions connexes