在Python中向数组添加具有特定值的dict键

时间:2014-09-11 03:33:54

标签: python python-2.7 dictionary

如果以前曾经问过这个问题,我很抱歉,但我四处搜索,似乎无法弄清楚这样做的语法。

我有一本字典,我正在尝试将具有特定值(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',...]

2 个答案:

答案 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)]