2015-12-04 2 views
4

В Python я пытаюсь применить оператор к двухслойному вложенному массиву. Например,«Карта» вложенный список в Python

a = [['2.3','.2'],['-6.3','0.9']] 
for j in range(2) 
    for i in range(2) 
     a[i][j] = float(a[i][j]) 

Как это сделать без петель? Я надеюсь на что-то похожее на карту a = (float, a). Конечно, последний скрипт не работает для вложенного списка. Также может быть приемлемым понимание одной строки.

ответ

5

Один лайнер с соединением map и listcomp:

a = [map(float, suba) for suba in a] # Only works on Py2 

Или варианты:

# Both of the below work on Py2 and Py3 
a = [list(map(float, suba)) for suba in a] 
a = [[float(x) for x in suba] for suba in a] 

Выберите на основе ваших личных предпочтений и целевой версии Python. Для больших вложенных списков на CPython 2 первый вариант, вероятно, самый быстрый (если внутренние списки огромны, он позволяет избежать накладных расходов на поиск, чтобы получить конструктор float и выполнение байтового кода для внутреннего list s), а завершенный эквивалент list может в конечном итоге выигрывать на CPython 3; для небольших вложенных списков во всех версиях вложенные списки, как правило, будут самыми быстрыми.

1

Первый аргумент требует функции, и поэтому вы можете использовать лямбда-оператор для сопоставления float с суб-списками. Это пример:

a = map(lambda b : map(float, b), a) 
+1

FYI, единственное преимущество «отображения карт» над списком (краткость и скорость при применении существующих встроенных функций) теряется, когда вы используете его с функциями «лямбда» (потому что каждый вызов функции «лямбда» добавляет лишние накладные расходы, позволяющие полностью очертить одну и ту же работу в понимании списка). – ShadowRanger

4

со списком понимания:

a = [[float(j) for j in i] for i in a] 
+0

Это выравнивает вложенный список; после этого это не 2D. – ShadowRanger

+0

@ShadowRanger, вы правы, не обращали внимания на то, что ... обновит ответ ... –

1

Под капотом map петля тоже. Вы должны просто использовать список понимание, однако есть хороший способ сделать это с python2 - вам просто нужно partial функцию

>>> a = [['2.3','.2'],['-6.3','0.9']] 
>>> from functools import partial 
>>> map(partial(map, float), a) 
[[2.3, 0.2], [-6.3, 0.9]] 

Я не думаю, что это хороший способ, чтобы преобразовать это Python3 хотя

>>> list(map(list, map(partial(map, float), a))) #YUKKK! 
[[2.3, 0.2], [-6.3, 0.9]] 
Смежные вопросы