2014-09-11 65 views
0

如果以前曾询问过此问题,我很遗憾,但是我四处搜索,似乎无法弄清楚执行此操作的语法。将具有特定值的dict键添加到Python中的数组中

我有一本字典,我试图将所有具有特定值(xColor)的键添加到我的Python列表(列表)中。我知道values()和keys()不带任何参数,但我不知道如何遍历字典(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',...] 

回答

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

你可以使用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)] 
相关问题