2016-07-18 2 views

ответ

2

Проблема, которую вы наблюдаете, возникает из-за того, что внутренний map возвращает последовательность списков, а не последовательность чисел. Это связано с тем, что map выполняет итерацию по списку, содержащему меньшие списки. Итак, если вы используете itertools.chain.from_iterable, чтобы сгладить этот список, вы получите последовательность чисел. Затем вы можете использовать внешнее map в тройные их

In [67]: L = [[1, 2],[3, 4]] 

In [68]: for i in map(lambda i: 3*i, itertools.chain.from_iterable(L)): print(i) 
3 
6 
9 
12 
1

Ваш код не работает, как ожидалось, потому что в Python оператор * полиморфный. Таким образом, если x и n являются числами, x*n возвращает произведение обоих чисел, но если один из операндов (скажем n) является целым числом, а другой представляет собой последовательность (.e. x - это список, кортеж или строка) выражение x*n возвращает последовательность, результаты которой конкатенируются x с самим собой n раз. Примеры:

>>> .1 * 2.5 
0.25 
>>> [1, 2] * 3 
[1, 2, 1, 2, 1, 2] 
>>> "beep" * 2 
beepbeep 

Для того, чтобы получить ожидаемый результат вы должны выравниваться список перед нанесением map():

>>> your_list = [[1, 2], [3, 4]] 
>>> flat_list = [item for sublist in your_list for item in sublist] 
>>> flat_list 
[1, 2, 3, 4] 
>>> triples = map(lambda x: 3*x, flat_list) 
>>> triples 
[3, 6, 9, 12] 

На самом деле вам не нужно использовать map() и lambda. Я думаю, что использование однострочного списка будет более питоновским:

>>> triples = [3*item for sublist in your_list for item in sublist] 
>>> triples 
[3, 6, 9, 12] 
Смежные вопросы