字典中字典的Python列表推导式?
我刚刚学会了列表推导,这是一种很快速的方法,可以用一行代码获取数据。不过,有些地方让我感到困惑。
在我的测试中,我有这样的字典放在列表里:
[{'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)
关于这段代码的一些说明:
- 我使用了生成器表达式,而不是列表推导式。
- 在Python中,你可以把不等式测试结合起来,比如用
low < value < high
这样的方式。 - 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 ])
这个代码会接收你指定的字典,然后返回一个“过滤过的”字典。