可能是一个非常天真的问题:
我有一个清单:
color = ["red","blue","red","green","blue"]
Run Code Online (Sandbox Code Playgroud)
现在,我想遍历列表
for c in color:
# color is "red"
get the rest of the colors except this red
so rest = ["blue","red","green",blue"]
Run Code Online (Sandbox Code Playgroud)
在下一次迭代中:
c = blue
rest = ["red","red","green","blue"]
Run Code Online (Sandbox Code Playgroud)
呃.为什么我有一种感觉,这是非常微不足道的..并且可能有一个单行命令可以解决这个问题?谢谢
想到这一点最简单的方法是,你希望迭代每个组合,其长度比列表长一个.为此,我们可以使用itertools.combinations():
import itertools
color = ["red","blue","red","green","blue"]
for rest in itertools.combinations(color, len(color)-1):
print(rest)
Run Code Online (Sandbox Code Playgroud)
这给了我们:
('red', 'blue', 'red', 'green')
('red', 'blue', 'red', 'blue')
('red', 'blue', 'green', 'blue')
('red', 'red', 'green', 'blue')
('blue', 'red', 'green', 'blue')
Run Code Online (Sandbox Code Playgroud)
这是一个很好的解决方案,因为它适用于迭代和序列,非常易读,而且应该很好而且快速.
如果你还需要当前值,你也可以轻松地获得它,因为combinations()它给你一个可预测的顺序,所以我们只是同时迭代两个zip()(当然,如果你想要最好的性能,itertools.izip()在Python 2.x下使用, as zip()创建一个列表,而不是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')
Run Code Online (Sandbox Code Playgroud)
在这里,我反向输入comibinations(),因此由左到右的作品-你可以逆转color的zip(),而不是让从右到左.
所以是的,简而言之,它是一个单行解决方案(如果计算导入,则为两个).