У меня есть этот вложенный список:
l = [['40', '20', '10', '30'], ['20', '20', '20', '20', '20', '30', '20'], ['30', '20', '30', '50', '10', '30', '20', '20', '20'], ['100', '100'], ['100', '100', '100', '100', '100'], ['100', '100', '100', '100']]
Теперь я хочу преобразовать каждый элемент списка в плавающее. Мое решение таково:
newList = []
for x in l:
for y in x:
newList.append(float(y))
Но можно ли это сделать, используя понимание вложенного списка, верно?
что я сделал, это:
[float(y) for y in x for x in l]
Но тогда получается куча сотен с суммой 2400.
Любое решение, объяснение будет высоко ценится. Спасибо!
python
list
nested
list-comprehension
Бой Пасмо
источник
источник
Ответы:
Вот как вы могли бы сделать это с пониманием вложенного списка:
Это даст вам список списков, похожий на тот, с которого вы начали, за исключением случаев с плавающими вместо строк. Если вы хотите один плоский список, то вы бы использовали
[float(y) for x in l for y in x]
.источник
Вот как конвертировать вложенный цикл для понимания вложенного списка:
Вот как работает понимание вложенного списка:
Для вашего случая это будет примерно так.
источник
(f(x) for x in l)
местами вторая строка цикла for эквивалентна слева.источник
Не уверен, каков ваш желаемый результат, но если вы используете понимание списка, порядок следует за порядком вложенных циклов, который у вас есть в обратном порядке. Итак, я получил то, что я думаю, вы хотите с:
Принцип таков: используйте тот же порядок, который вы использовали бы при записи, как вложенные для циклов.
источник
У меня была похожая проблема, чтобы решить, поэтому я столкнулся с этим вопросом. Я сделал сравнение производительности ответа Эндрю Кларка и Нарайана, которым я хотел бы поделиться.
Основное различие между двумя ответами состоит в том, как они перебирают внутренние списки. Один из них использует встроенную карту , в то время как другой использует понимание списка. Функция карты имеет небольшое преимущество в производительности по сравнению с ее эквивалентным пониманием списка, если она не требует использования лямбда-выражений . Так что в контексте этого вопроса
map
должно работать немного лучше, чем понимание списка.Давайте сделаем тест производительности, чтобы увидеть, если это действительно так. Я использовал Python версии 3.5.0 для выполнения всех этих тестов. В первом наборе тестов я бы хотел, чтобы количество элементов в списке составляло 10, а количество списков варьировалось от 10 до 100 000.
В следующем наборе тестов я хотел бы поднять количество элементов в списках до 100 .
Давайте сделаем смелый шаг и изменим количество элементов в списках на 1000
Из этих тестов мы можем сделать вывод, что
map
в этом случае выигрыш в производительности превосходит понимание списка. Это также применимо, если вы пытаетесь привести кint
илиstr
. Для небольшого количества списков с меньшим количеством элементов в списке, разница незначительна. Для больших списков с большим количеством элементов в списке можно использоватьmap
вместо понимания списка, но это полностью зависит от потребностей приложения.Однако я лично считаю, что понимание списка более читабельно и идиоматично, чем
map
. Это де-факто стандарт в Python. Обычно люди более опытны и удобны (особенно новички) в использовании понимания списка, чемmap
.источник
Так как я немного опоздал, но я хотел бы поделиться тем, как на самом деле работает понимание списка, особенно вложенное понимание списка:
на самом деле так же, как:
А теперь вложенный список понимания:
такой же как;
вывод:
источник
Если вам не нравятся вложенные списки, вы можете также использовать функцию карты ,
источник
>>> float_l = [map(float, nested_list) for nested_list in l]
[[<map at 0x47be9b0>], [<map at 0x47be2e8>], [<map at 0x47be4a8>], [<map at 0x47beeb8>], [<map at 0x484b048>], [<map at 0x484b0b8>]]
но добавляя дополнительный вызов в список, он работает как положено:>>> float_l = [list(map(float, nested_list)) for nested_list in l]
python3
чтобы вернуть генераторы из понимания.Да, вы можете сделать это с помощью такого кода:
источник
[float(y) for y in x for x in l]
это привело бы к сотне сотен с суммой 2400.Эта проблема может быть решена без использования цикла for. Для этого будет достаточно однострочного кода. Использование Nested Map с лямбда-функцией здесь также работает.
И список вывода будет выглядеть следующим образом:
источник
На мой взгляд, лучший способ сделать это - использовать
itertools
пакет python .источник
Да, вы можете сделать следующее.
источник
Это может быть достигнуто с помощью понимания списка:
источник