2017-01-26 7 views
3

Есть ли способ Pythonic для конкатенации списка списков, исключая индекс выбора? Например, если бы я имелОбъединить список списков, исключая один индекс

[['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']] 

и не хотел индекс 1 в результате мой сцепленных список будет выглядеть следующим образом:

['a', 'd', 'e', 'f', 'g'] 

Я мог бы сделать это с петлей и проверка против итерации против мой индекс выбора, но я надеюсь, что есть более чистый способ.

ответ

3

Вы можете использовать нарезка:

from itertools import chain 

ls = [['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']] 

list(chain.from_iterable(ls[:1] + ls[2:])) 

Если вы хотите, чтобы избежать затрат на добавление ломтики вместе и создавать новые списки, это становится немного сложнее:

from itertools import chain, islice 
list(chain.from_iterable(chain(islice(ls, 1), islice(ls, 2, None)))) 
+1

Если вы собираетесь использовать itertools вы также можете использовать 'islice', чтобы избежать временных списков творения. – MSeifert

+0

Я использую современные версии Python, там не создается список. – L3viathan

+1

, но 'ls [: 1]' и 'ls [2:]' оба создают новые списки. Не берите в голову, для такой проблемы, в общем-то, это полный избыток :) – MSeifert

0

Вот один путь:

lists = [['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']] 
subset = [x for ind, x in enumerate(lists) if ind != 1] 
subset # [['a'], ['d'], ['e', 'f', 'g']] 
flattened = [item for l in subset for item in l] 
flattened # ['a', 'd', 'e', 'f', 'g'] 

Вы могли бы объединить их в единое понимание, я сделал это в два этапа здесь, чтобы s как ясно, что делает каждая часть.

0

Если вы не возражаете, используя внешнюю библиотеку, я мог бы предложить remove и flatten от iteration_utilities :

>>> from iteration_utilities import remove, flatten 

>>> l = [['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']] 

>>> list(flatten(remove(l, 1))) 
['a', 'd', 'e', 'f', 'g'] 

1 Я автор этой библиотеки.

0

это не ~ «Я мог бы сделать это с петлей и проверка против итерации против моего индекса выбора ....»

, но в списке понимании, нет ЛИЭСА

nix = 1 

myls = [['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']] 

[e for ls in myls for e in ls if ls != myls[nix]]  

Out[11]: ['a', 'd', 'e', 'f', 'g'] 

отсутствия необходимости перечислять либо

другого ломтика и сплющиваются возможности, которые читают хорошо

sum(myls[:nix] + myls[nix+1:],[]) 

, но некоторые из них имеют проблемы с использованием суммы таким образом https://mathieularose.com/how-not-to-flatten-a-list-of-lists-in-python/