如果以前曾经问过这个问题,我很抱歉,但我四处搜索,似乎无法弄清楚这样做的语法。
我有一本字典,我正在尝试将具有特定值(xColor)的所有键添加到我的Python列表(列表)中。我知道values()和keys()不接受任何参数,但我不知道如何迭代我的dict(tile)中的元素来做我需要的。
这是我的尝试:
for colors in tile.values():
for cords in tile.keys():
if tile.values(colors) == xColor:
list.append(tile.keys(cords))
else:
return
仅供参考,
xColor = 'pink'
tile = {(0,0): 'pink', ...}
tile.keys() = [(0,0), ...]
tile.values() = ['pink',...]
答案 0 :(得分:3)
首先,你真的应该阅读教程中的Data Structures,因为它解释了诸如"如何遍历我的词典中的元素"。
但是简单地说,您可以通过使用dict本身作为迭代器来遍历键,并且可以使用items()
或iteritems()
方法迭代键值对。
您的代码正在迭代值,然后,对于每个值,迭代键。没有理由这样做。你想要具有特定值的键;你不在乎任何其他钥匙。此外,您的函数将转到return
(意味着它会在匹配失败后立即停止两个循环,并在完成构建列表的所有工作后返回无用的None
。
您可以通过以下两种方式之一修复代码:
matches = []
for cord, color in tile.iteritems():
if color == xColor:
matches.append(cord)
return matches
或者:
matches = []
for cord in tile:
color = tile[cord]
if color == xColor:
matches.append(cord)
return matches
两者基本相同。查找tile[cord]
以获取color
很简单,而且非常便宜。
如果你对列表推导有所了解,你可能会认识到第一个中的模式正是列表理解的作用。因此,您可以将整个事物转换为单行:
return [cord for cord, color in tile.iteritems() if color == xColor]
答案 1 :(得分:1)
您可以对生成器使用list.extend
方法,提取所需的键:
In [9]: d = {(0, 0): 'pink', (0, 1): 'pink', (2, 3): 'blue', (3, 2): 'red'}
In [10]: x_color = 'pink'
In [11]: [k for (k, v) in d.iteritems() if v == x_color]
Out[11]: [(0, 1), (0, 0)]
In [12]: l = [(2, 4)]
In [13]: l.extend(k for (k, v) in d.iteritems() if v == x_color)
In [14]: l
Out[14]: [(2, 4), (0, 1), (0, 0)]