连接除一个索引之外的列表列表

时间:2017-01-26 18:34:56

标签: python list-comprehension

是否有用于连接列表列表的Pythonic方法,不包括选择的索引?例如,如果我有

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

并且在结果中不希望索引1,我的连接列表看起来像:

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

我可以通过循环执行此操作并根据我选择的索引检查迭代,但我希望有更简洁的方法。

4 个答案:

答案 0 :(得分: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 :(得分: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']

你可以将这些结合到一个单一的理解中,我在这里分两步完成,以更清楚地显示每个部分的作用。

答案 2 :(得分:0)

如果您不介意使用外部库我可以从remove 1 提供flatteniteration_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我是该图书馆的作者。

答案 3 :(得分:0)

这是〜“我可以通过循环执行此操作并根据我选择的索引检查迭代....”

但是在列表理解中,没有libs

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:],[])

但是有些人使用sum https://mathieularose.com/how-not-to-flatten-a-list-of-lists-in-python/

的方式存在问题