从list中检索元素:python

时间:2012-05-03 20:24:21

标签: python

可能是一个非常天真的问题:

我有一个清单:

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。为什么我有一种感觉,这是非常微不足道的..并且可能有一个单行命令可以解决这个问题? 感谢

6 个答案:

答案 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)