是否有用于连接列表列表的Pythonic方法,不包括选择的索引?例如,如果我有
[['a'], ['b', 'c'], ['d'], ['e', 'f', 'g']]
并且在结果中不希望索引1,我的连接列表看起来像:
['a', 'd', 'e', 'f', 'g']
我可以通过循环执行此操作并根据我选择的索引检查迭代,但我希望有更简洁的方法。
答案 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 提供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我是该图书馆的作者。
答案 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/
的方式存在问题