連接列表的列表是否存在Pythonic方式,不包括選擇的索引?舉例來說,如果我有連接不包含一個索引的列表的列表
[['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']]
,不想在結果指標1,我的拼接列表看起來像:
['a', 'd', 'e', 'f', 'g']
我可以用一個循環做到這一點,並檢查反對對迭代我的選擇索引,但我希望有一個更清潔的方式。
連接列表的列表是否存在Pythonic方式,不包括選擇的索引?舉例來說,如果我有連接不包含一個索引的列表的列表
[['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']]
,不想在結果指標1,我的拼接列表看起來像:
['a', 'd', 'e', 'f', 'g']
我可以用一個循環做到這一點,並檢查反對對迭代我的選擇索引,但我希望有一個更清潔的方式。
你可以用切片:
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))))
這裏是一個方式:
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多清楚每個部分的作用。
如果你不介意使用一個外部庫,我可以從iteration_utilities
提供remove
和flatten
:
>>> 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我該庫的作者。
這是〜「我可以用一個循環,並覈對反對我選擇的指標迭代做到這一點......」
,但在列表理解,沒有庫
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/
如果你打算使用itertools你也可以用'islice'避免臨時列表創作的一個問題。 – MSeifert
我使用Python的最新版本,它不會在那裏創建一個列表。 – L3viathan
但是'ls [:1]'和'ls [2:]'都創建了新列表。沒關係,因爲這樣的問題總是矯枉過正:) – MSeifert