2017-01-26 113 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/

相关问题