2010-12-01 1 views
2

Мне нужно было бы использовать функцию карты в Python (2.4.4), чтобы добавить 1 к каждому элементу в списке, поэтому я попытался преобразовать строки в целые числа.Как использовать функцию карты на вложенных списках и преобразовывать строки в целые числа?

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

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

Это не работает из-за \n и гнезда?

+1

Ну, это ошибка, которую я получаю: `TypeError: int() аргумент должен быть строкой или числом, а не 'list'` – chrisaycock 2010-12-01 19:36:51

+1

Вам нужно перебирать списки в списке, а не только в первом списке (который имеет члены списка типов). – 2010-12-01 19:38:02

ответ

4

Ну, ваши намерения не ясны, но это не связано с \ n.

См:

>>> 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

Этот метод имеет смысл. Благодарю. – Carter 2010-12-02 08:26:41

6

Я хотел бы использовать список понимание, но если вы хотите map

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

список понимание будет

[[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

Это прекрасно работает. Благодарю. – Carter 2010-12-02 08:27:59

1

Преобразование строки с символами новой строки в целое число не является проблемой (но int("1a") будет неоднозначным, fo Например, Python не позволяет это делать).

Отображение в вашем коде передает подсчет функции лямбда, один за другим. Поэтому вам нужно перебрать внутренние списки еще раз:

>>> 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]] 

Для увеличения на единицу, это было бы так же просто, как и выше:

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

Еще один хороший подход. – Carter 2010-12-02 08:28:55

1

Использование аргумента распаковки.

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

Один контур, без лямбда.

Смежные вопросы