字典中字典的Python列表推导式?

33 投票
6 回答
72766 浏览
提问于 2025-04-16 01:11

我刚刚学会了列表推导,这是一种很快速的方法,可以用一行代码获取数据。不过,有些地方让我感到困惑。

在我的测试中,我有这样的字典放在列表里:

[{'y': 72, 'x': 94, 'fname': 'test1420'}, {'y': 72, 'x': 94, 'fname': 'test277'}]

这个列表推导 s = [ r for r in list if r['x'] > 92 and r['x'] < 95 and r['y'] > 70 and r['y'] < 75 ] 在这个情况下运行得很好(实际上,这行代码就是这个结果)

不过,我后来意识到在我的另一个项目中,我其实并没有使用列表,而是使用了字典。像这样:

{'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'}}

这样我就可以简单地用 var['test1420'] = ... 来编辑我的字典

但是列表推导在这种情况下不适用!而且我不能用这种方式编辑列表,因为你不能像那样给列表的索引赋值。

有没有其他的方法呢?

6 个回答

6

听起来你想要的是这样的东西:

my_dict = {'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'},
           'test277' : {'y': '072', 'x': '094', 'fname': 'test277'}}


new_dict = dict((k,v) for k,v in my_dict.items() 
                    if 92 < int(v['x']) < 95 and 70 < int(v['y']) < 75)

关于这段代码的一些说明:

  1. 我使用了生成器表达式,而不是列表推导式。
  2. 在Python中,你可以把不等式测试结合起来,比如用 low < value < high 这样的方式。
  3. dict()构造函数可以接受一个包含键值对元组的可迭代对象来创建字典。
10

如果 dct

{'test1420': {'y': '060', 'x': '070', 'fname': 'test1420'},
 'test277': {'y': 72, 'x': 94, 'fname': 'test277'},}

也许你在寻找类似这样的东西:

[ subdct for key,subdct in dct.iteritems() 
  if 92<subdct['x']<95 and 70<subdct['y']<75 ]

一个小技巧是,Python 允许你把不等式连在一起:

92<dct[key]['x']<95

而不是

if r['x'] > 92 and r['x'] < 95

另外,我上面写的是一个列表推导式,所以你会得到一个列表(在这个例子中,是字典的列表)。

在 Python3 中,还有一种叫做 字典推导式 的东西:

{ n: n*n for n in range(5) } # dict comprehension
{0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

在 Python2 中,相应的写法是

dict( (n,n*n) for n in range(5) )

我不确定你是想要一个字典的列表,还是一个字典里面包含字典,但如果你理解上面的例子,修改我的答案来得到你想要的结果是很简单的。

48

你可以这样做:

s = dict([ (k,r) for k,r in mydict.iteritems() if r['x'] > 92 and r['x'] < 95 and r['y'] > 70 and r['y'] < 75 ])

这个代码会接收你指定的字典,然后返回一个“过滤过的”字典。

撰写回答