想到这一点的最简单方法是,您要遍历每个长度比列表小一的组合。为此,我们可以使用itertools.combinations()
:
import itertools
color = ["red","blue","red","green","blue"]
for rest in itertools.combinations(color, len(color)-1):
print(rest)
这给了我们:
('red', 'blue', 'red', 'green')
('red', 'blue', 'red', 'blue')
('red', 'blue', 'green', 'blue')
('red', 'red', 'green', 'blue')
('blue', 'red', 'green', 'blue')
这是一个很好的解决方案,因为它适用于可迭代对象和序列,非常易读,并且应该又好又快。
如果你还需要当前值,你也可以很容易地得到它,因为combinations()
它给你一个可预测的顺序,所以我们只是同时迭代两者zip()
(当然,如果你想要最好的性能,itertools.izip()
在 Python 2.x 下使用, aszip()
创建一个列表,而不是 3.x 中的生成器)。
import itertools
color = ["red","blue","red","green","blue"]
for c, rest in zip(color, itertools.combinations(reversed(color), len(color)-1)):
print(c, rest)
red ('blue', 'green', 'red', 'blue')
blue ('blue', 'green', 'red', 'red')
red ('blue', 'green', 'blue', 'red')
green ('blue', 'red', 'blue', 'red')
blue ('green', 'red', 'blue', 'red')
在这里,我反转输入,comibinations()
使其从左到右工作 - 您可以反转color
以zip()
从右到左。
所以是的,简而言之,这是一个单行解决方案(如果计算导入,则为两个)。