我是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)
答案 0 :(得分: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']
答案 1 :(得分: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'])
如果您希望所有整数不在最终集合中的第一个位置而第二个答案在第一个位置找不到任何整数,则第一个答案将失败,因此您应说明这些情况应该发生什么。
答案 2 :(得分: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'])
答案 3 :(得分: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
。它会覆盖内置类型。
答案 4 :(得分:0)
theColours = set()
for colours in d.values():
[theColours.add(colour) for colour in colours[1:]]
list(theColours)
答案 5 :(得分: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']
正如海德罗所说,不要将字典命名为dict
答案 6 :(得分:-1)
创建set
以删除重复项,然后通过内置的sorted()
运行它以返回列表。
newlist = sorted(set(dict.values()[1:]))