可能是一个非常天真的问题:
我有一个清单:
color = ["red","blue","red","green","blue"]
现在,我想遍历列表
for c in color:
# color is "red"
get the rest of the colors except this red
so rest = ["blue","red","green",blue"]
在下一次迭代中:
c = blue
rest = ["red","red","green","blue"]
的Eh。为什么我有一种感觉,这是非常微不足道的..并且可能有一个单行命令可以解决这个问题? 感谢
答案 0 :(得分:6)
最简单的思考方式是,您希望迭代每个组合,其长度小于列表的长度。为此,我们可以使用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()
同时迭代两者(当然,如果如果你想获得最佳性能,请在Python 2.x下使用itertools.izip()
,因为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')
在此,我将comibinations()
的输入反转,使其从左向右工作 - 您可以在color
中反转zip()
,而不是从右到左。
所以是的,简而言之,它是一个单行解决方案(如果计算导入,则为两个)。
答案 1 :(得分:1)
切片和枚举可以轻松完成此任务:
>>> colors = ["red", "blue", "red", "green", "blue"]
>>> for i, color in enumerate(colors):
rest = colors[:i] + colors[i+1:]
print color, '-->', rest
red --> ['blue', 'red', 'green', 'blue']
blue --> ['red', 'red', 'green', 'blue']
red --> ['red', 'blue', 'green', 'blue']
green --> ['red', 'blue', 'red', 'blue']
blue --> ['red', 'blue', 'red', 'green']
enumerate跟踪每种颜色的位置,切片在颜色前后提取列表中的部分。
答案 2 :(得分:1)
这也应该有用
for i in range(len(yourlist)):
newlist = yourlist[:i] + yourlist[i:]
答案 3 :(得分:0)
此Python代码将创建一个没有重复项的新输出列表。
done = []
for c in color:
if c in done:
continue
done.append(c)
print c
答案 4 :(得分:0)
以下示例将返回删除了重复项的列表。它以空的返回列表开始,检查颜色列表,如果颜色(在本例中为红色)已经在输出中,则忽略它。
#!/usr/bin/env python
color = ["red","blue","red","green","blue"]
def rem_dup(dup_list):
corrected_list = []
for color in dup_list:
if color in corrected_list:
continue
else:
corrected_list.append(color)
return corrected_list
使用像
这样的东西可能会更好>>> set(color)
set(['blue', 'green', 'red'])
>>>
或
>>> import collections
>>> color = ["red","blue","red","green","blue"]
>>> collections.OrderedDict.fromkeys(color)
OrderedDict([('red', None), ('blue', None), ('green', None)])
>>>
删除重复项。两者都比for循环更有效。
答案 5 :(得分:-2)
for idx, item in enumerate(color):
print 'I am %s' % item
rest = color[:idx] + color[idx+1:]
print 'Rest is %s' % ','.join(rest)