2

可能是一个非常幼稚的问题:

我有一个清单:

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"]

嗯。为什么我觉得这很简单……而且可能有一个单行命令可以解决这个问题?谢谢

4

6 回答 6

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()(当然,如果你想要最好的性能,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()使其从左到右工作 - 您可以反转colorzip()从右到左。

所以是的,简而言之,这是一个单行解决方案(如果计算导入,则为两个)。

于 2012-05-03T20:27:16.677 回答
1

这也应该有效

for i in range(len(yourlist)):
    newlist = yourlist[:i] + yourlist[i:]
于 2012-05-03T20:43:46.913 回答
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']

枚举跟踪每种颜色的位置,切片提取颜色之前和之后的列表部分。

于 2012-05-03T20:38:23.817 回答
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 循环更有效。

于 2012-07-16T13:42:02.920 回答
0

此 Python 代码将创建一个没有重复项的新输出列表。

done = []
for c in color:
    if c in done:
        continue
    done.append(c)
    print c
于 2012-05-03T20:27:30.243 回答
-2
for idx, item in enumerate(color):
    print 'I am %s' % item
    rest = color[:idx] + color[idx+1:]
    print 'Rest is %s' % ','.join(rest)
于 2012-05-03T20:28:33.880 回答