我有一个Python字典,如:
Mydict = {'a':{'y':1,'x':5},'b':{'y':10,'x':8}}
有没有快捷方法可以访问与密钥对应的值:'x',在这种情况下是二级密钥,而不管第一级密钥?
我知道可以使用for循环来完成:
mylist=[]
for k in Mydict.keys():
mylist.append(Mydict[k]['x'])
但是有没有快速的一行方法呢?
答案 0 :(得分:5)
mylist = [v['x'] for v in Mydict.values()]
由于您不需要外键,您只需迭代内部词,并获得所需的'x'
值。
注意:这只有在每个内部字典都有一个'x'
键时才有效,并且为了最大限度地减少错误,你可以这样做:
mylist = [v.get('x', None) for v in Mydict.values()]
这将起到相同的作用,只有在字典中没有'x'
键时,它才会返回None
而不是KeyError
例外。
对于时间安排,以及查看哪种方法最佳,请查看Thorsten Kranz
的答案答案 1 :(得分:2)
为了完整性:map
通常是列表理解的一个很好的替代方法,例如
mylist = map(lambda v: v['x'], Mydict.values())
或
mylist = map(lambda k: Mydict[k]['x'], Mydict)
通常由您自己喜欢。
修改强>
随着性能的提升,这里有1,000,000次重复的快速比较:
import timeit
Mydict = {'a': {'y': 1, 'x': 5}, 'b': {'y': 10, 'x': 8}}
def list_append(d):
mylist=[]
for k in d.keys():
mylist.append(d[k]['x'])
def list_comprehension_values(d):
return [v['x'] for v in d.values()]
def list_comprehension_keys(d):
return [d[k]['x'] for k in d]
def map_values(d):
return map(lambda v: v['x'], d.values())
def map_keys(d):
return map(lambda k: d[k]['x'], d)
for method_name in ["list_append",
"list_comprehension_values",
"list_comprehension_keys",
"map_values",
"map_keys"]:
t = timeit.timeit(method_name + "(Mydict)",
"from __main__ import Mydict, " + method_name,
number=1000000)
print "%s: %.2f seconds" % (method_name, t)
结果:
list_append: 0.95 seconds
list_comprehension_values: 0.56 seconds
list_comprehension_keys: 0.47 seconds
map_values: 1.02 seconds
map_keys: 1.01 seconds
* 编辑2 *
更大的字典
Mydict = dict(zip(range(10000),
[{'x' : random.randint(0,10), 'y' : random.randint(0,10)}
for i in range(10000)]))
且重复次数减少(数量= 10000),值不同:
list_append: 16.41 seconds
list_comprehension_values: 6.00 seconds
list_comprehension_keys: 9.62 seconds
map_values: 15.23 seconds
map_keys: 18.42 seconds
因此,保存密钥查找更好。
答案 2 :(得分:0)
列表理解将是一行,几乎是两倍:
mylist = [mydict[k]['x'] for k in mydict]
答案 3 :(得分:0)
使用列表理解
mylist = [Mydict[k]['x'] for k in Mydict]
请注意,迭代Mydict
会自动遍历密钥,因此无需迭代Mydict.keys()
。