连接列表的列表是否存在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