2017-01-26 65 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

如果你不介意使用一個外部庫,我可以從iteration_utilities 提供removeflatten

>>> 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/

相關問題