1

我对 Python (2.x) 非常陌生,并试图了解如何迭代包含多个列表的字典:

dict = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}

我正在尝试创建一个包含这些列表的所有唯一值的新列表,但忽略第一项(整数)。我正在寻找的结果是:

['green', 'yellow', 'black', 'blue']

这是我的众多尝试之一。我很迷茫,所以如果有人能解释我将不胜感激。

newlist = []
for colors in dict.values() [1:]:
    if not colors in newlist:
        newlist.append(colors)
4

7 回答 7

1

一种方法itertools.chain用于将 dict 值展平为单个列表,然后list comprehension过滤掉非字符串值,最后过滤掉set唯一值:

In [1]: from itertools import chain
In [2]: dict={'list_1':[3,'green','yellow','black'],'list_2':[2,'green','blue']}
In [3]: set([x for x in chain(*dict.values()) if isinstance(x, str)])
Out[3]: set(['blue', 'black', 'green', 'yellow'])

如果真的只想删除列表中的第一项而不是所有整数,那么您可以类似地执行以下操作:

In [4]: set(chain(*[x[1:] for x in dict.itervalues()]))
Out[4]: set(['blue', 'black', 'green', 'yellow'])

如果您希望所有整数不在最后一组的第一个位置,第一个答案会失败,而第二个答案会因为在第一个位置找不到任何整数而失败,因此您应该说明这些情况应该发生什么。

于 2013-08-14T10:08:57.410 回答
1

使用set.union

>>> dic = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}
>>> set().union(*(x[1:] for x in dic.itervalues()))
set(['blue', 'black', 'green', 'yellow'])

如果需要列表,只需将此集合传递给list().

您尝试的工作版本,尽管效率不高;

newlist = []
for colors in dic.values():
    lis = colors[1:]        #do slicing here
    for item in lis:
        if item not in newlist:
            newlist.append(item)
print newlist #['green', 'blue', 'yellow', 'black']
于 2013-08-14T10:05:23.067 回答
0

如果你打印dict.values(),你会得到:

[[2, 'green', 'blue'], [3, 'green', 'yellow', 'black']]

因此,当您尝试对其进行切片时,您会得到:

[[3, 'green', 'yellow', 'black']]

因此,您想要切片colors而不是dict.values()

for colors in t.values():
    colors = colors[1:]

现在还有一个问题。您正在检查列表是否已在列表中看到,而不是每个项目。所以你必须再次循环。

for colors in t.values():
    colors = colors[1:]
    for color in colors:

请注意,这可能会导致您的脚本没有如此出色的性能,因此您可能会执行以下操作:

>>> from itertools import chain
>>> [i[1:] for i in t.values()]
[['green', 'blue'], ['green', 'yellow', 'black']]
>>> list(chain.from_iterable(i[1:] for i in t.values()))
['green', 'blue', 'green', 'yellow', 'black']

因此,集成到您的代码中:

new = set() # Better for performance to use sets
for color in chain.from_iterable(i[1:] for i in t.values()):
    if color not in new:
        new.add(color)

print new

印刷:

set(['blue', 'black', 'green', 'yellow']) # If you need order, use a list instead.

顺便说一句,不要命名字典dict。它覆盖了内置类型。

于 2013-08-14T10:14:43.737 回答
0

即使您在其他索引处有整数,这也会起作用:

>>> di = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}
>>> set(x for value in di.values() for x in value if not isinstance(x, int))
set(['blue', 'black', 'green', 'yellow'])
于 2013-08-14T10:09:12.037 回答
0

这是给你的单线

>>> d = {'list_1':[3, 'green', 'yellow', 'black'], 'list_2':[2, 'green', 'blue']}
>>> list(set(i for x in d.itervalues() for i in x[1:]))
['blue', 'black', 'green', 'yellow']

正如 Haidro 所说,不要命名字典dict

于 2013-08-14T10:27:56.887 回答
0
theColours = set()
for colours in d.values():
    [theColours.add(colour) for colour in colours[1:]]
list(theColours)
于 2013-08-14T10:16:54.353 回答
-1

创建一个set以删除重复项,然后通过sorted()内置运行它以返回一个列表。

newlist = sorted(set(dict.values()[1:]))
于 2013-08-14T10:06:52.117 回答