Свести список списков

У меня проблема с квадратными скобками в Python. Я написал код, который дает следующий результат:

[[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]

Но я бы хотел с этим произвести некоторые расчеты, но квадратные скобки мне не позволяют.

Как снять скобки? Я видел несколько примеров, но не мог применить их к этому случаю.


person Hellfish    schedule 29.06.2012    source источник
comment
Другими словами, у вас есть список списков, и вы хотите иметь возможность работать со всеми членами внутренних списков? Кроме того, поскольку все эти внутренние списки имеют одно значение, стоит ли гарантировать, что только значение вставляется во внешний список? Или возможно, что в некоторых списках будет несколько элементов? Важно предоставить всю возможную информацию как можно точнее.   -  person Platinum Azure    schedule 29.06.2012
comment
Чтобы помочь людям ответить на ваши вопросы в будущем, старайтесь избегать общих утверждений, таких как квадратные скобки не позволяют мне, и вместо этого приведите конкретный пример того, что вы пытались сделать, но не сработало, и скопируйте и вставьте небольшой тестовый код, показывающий возникшую ошибку.   -  person DSM    schedule 29.06.2012
comment
связанный плоский вложенный список   -  person jfs    schedule 29.06.2012
comment
Если они ответили на ваш вопрос, вы должны принять один из этих ответов.   -  person Paul Seeb    schedule 07.03.2014


Ответы (3)


Сгладьте список, чтобы «удалить скобки», используя вложенный список. Это приведет к отмене вложенности каждого списка, хранящегося в вашем списке списков!

list_of_lists = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]
flattened = [val for sublist in list_of_lists for val in sublist]

Понимания вложенных списков оцениваются так же, как они разворачиваются (т. Е. Добавляют новую строку и табуляцию для каждого нового цикла. Итак, в этом случае:

flattened = [val for sublist in list_of_lists for val in sublist]

эквивалентно:

flattened = []
for sublist in list_of_lists:
    for val in sublist:
        flattened.append(val)

Большая разница в том, что список comp вычисляет НАМНОГО быстрее, чем развернутый цикл, и исключает вызовы добавления!

Если у вас есть несколько элементов в подсписке, список даже сгладит их. т.е.

>>> list_of_lists = [[180.0, 1, 2, 3], [173.8], [164.2], [156.5], [147.2], [138.2]]
>>> flattened  = [val for sublist in list_of_lists for val in sublist]
>>> flattened 
[180.0, 1, 2, 3, 173.8, 164.2, 156.5, 147.2,138.2]
person Paul Seeb    schedule 29.06.2012
comment
Использовать itertools.chain.from_iterable намного проще. - person Platinum Azure; 29.06.2012
comment
Объясните, пожалуйста, почему. Это почти так же просто, как и получается - person Paul Seeb; 29.06.2012
comment
Извините, я имел в виду более читабельный / интуитивно понятный. Поскольку у OP возникают проблемы с определением двусмысленности между списками (последовательностями данных) и тем, как списки представлены в коде (с квадратными скобками), я очень сомневаюсь, что понимание двойного списка будет иметь для него / нее какой-либо смысл. - person Platinum Azure; 29.06.2012
comment
+1 за то, что он более чем в два раза быстрее (время), не требует импорта и более компактен- - person estani; 19.10.2012
comment
Мне нравится этот ответ, но я не могу его понять. Не могли бы вы рассказать мне, как Python оценивает понимание этого списка? - person ahoffer; 27.08.2014
comment
@ahoffer Я сделал несколько обновлений. Дайте мне знать, если это проясняет это. Спасибо за предложение. - person Paul Seeb; 28.08.2014
comment
@Павел. Фантастика. Видеть его разбитым на блоки было поучительно. - person ahoffer; 28.08.2014
comment
Хотя вопрос повторяется, я думаю, что этот ответ лучше всех других, которые я видел. Мне очень нравится понимание списков, но эта конкретная конструкция по какой-то причине остается неинтуитивной. - person travc; 27.04.2015

Я бы использовал itertools.chain - это также будет обслуживать> 1 элемент в каждом подсписке:

from itertools import chain
list(chain.from_iterable([[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]))
person Jon Clements♦    schedule 29.06.2012
comment
+1 за itertools, просто собирался опубликовать аналогичный ответ, но вы меня опередили. - person Platinum Azure; 29.06.2012
comment
Зачем вам импортировать целый модуль, чтобы делать что-то столь простое? - person Paul Seeb; 29.06.2012
comment
@PaulSeeb - самый простой, универсальный, встроенный метод сглаживания итерации итераций ... Что, если бы подсписки содержали 100 элементов? Я бы определенно не хотел набирать для этого код listcomp ... - person Jon Clements♦; 29.06.2012
comment
если в подсписке было 100 элементов, вложенный список мог бы справиться с этим без импорта всего модуля. В основном это просто стиль и предпочтения, но лично я считаю, что составление списков более читабельно, поскольку большинство программистов использовали составы списков, но не все прочитали всю библиотеку itertools. Не то чтобы на это трудно смотреть, но это еще одна вещь. - person Paul Seeb; 29.06.2012
comment
К сожалению, chain имеет тот же недостаток, что и понимание списка, в отношении многих уровней вложенности (то есть не рекурсивно). Однако я считаю, что itertools позволяет выполнять множество хороших операций с помощью легко читаемого кода, поэтому я все еще поддерживаю этот ответ, а не использую понимание двойного списка. - person Platinum Azure; 29.06.2012
comment
@PlatinumAzure Я писал, что он ломается, когда зазвонил телефон на глубине более 1 уровня - так что на этот раз вы меня опередили! Я также собирался упомянуть, что если список не нужно материализовать, тогда просто зацикливание итератора, генерируемого цепочкой, может быть преимуществом ... - person Jon Clements♦; 29.06.2012
comment
@JonClements, возможно, тоже. В своем ответе я собирался написать пример суммирования элементов с использованием reduce. Давай, беги с этим или чем-то подобным :-) - person Platinum Azure; 29.06.2012
comment
@PlatinumAzure Может, но тьфу - думаю, что я проверю это дождем;) - person Jon Clements♦; 29.06.2012
comment
К сожалению, это не делает различий между списками и строками. - person Cerin; 13.11.2013
comment
@cerin Действительно. Он работает исключительно с итерацией итераций (как и все другие ответы здесь). Так что да, список строк, скорее всего, приведет к бессмысленному результату. Однако это другой ответ, который может зависеть от версии Python и не был частью этого вопроса, основанного на списках одиночных чисел с плавающей запятой. - person Jon Clements♦; 13.11.2013
comment
Мне очень нравится твой ответ, но как сгладить [1, [2,3]]? - person len; 16.02.2021

Данный

d = [[180.0], [173.8], [164.2], [156.5], [147.2], [138.2]]

и ваш конкретный вопрос: Как убрать квадратные скобки?

Использование понимания списка:

new_d = [i[0] for i in d]

дам вам это

[180.0, 173.8, 164.2, 156.5, 147.2, 138.2]

тогда вы можете получить доступ к отдельным элементам с соответствующим индексом, например, new_d[0] даст вам 180.0 и т. д., который вы затем можете использовать для математики.

Если у вас будет набор данных, у вас будет какая-то скобка или скобка.

Примечание: это решение нацелено именно на ваш вопрос / проблему, оно не дает общего решения. То есть в вашем случае подойдет.

person Levon    schedule 29.06.2012
comment
OP плохо разбирается в списках, и это решение может вызвать нежелательные эффекты, если он / она хочет использовать его для сглаживания нескольких элементов (без ошибок, просто молча верните первый ...) - person estani; 19.10.2012