如何在Python字典中快速访问所有对应于特定二级键的值,而不管一级键是什么?

0 投票
4 回答
2880 浏览
提问于 2025-04-17 14:47

我有一个Python字典,内容如下:

Mydict = {'a': {'y': 1, 'x': 5}, 'b': {'y': 10, 'x': 8}}

有没有什么简单的方法可以快速获取与键'x'对应的值?在这个例子中,'x'是第二层的键,而不管第一层的键是什么。

我知道可以用一个循环来实现,比如:

mylist=[]
for k in Mydict.keys():
    mylist.append(Mydict[k]['x'])

但是有没有什么简单的一行代码可以做到呢?

4 个回答

0

使用列表推导式

mylist = [Mydict[k]['x'] for k in Mydict]

注意,遍历 Mydict 时,实际上是自动遍历它的键,所以不需要再单独遍历 Mydict.keys() 了。

2

为了完整性说明:map 通常是一个不错的替代选择,可以用来代替列表推导式,比如:

mylist = map(lambda v: v['x'], Mydict.values())

或者

mylist = map(lambda k: Mydict[k]['x'], Mydict)

这通常取决于你个人的喜好。

编辑:

关于性能的问题,这里有一个关于1000000次重复的快速比较:

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

所以在这里,节省查找键的时间是更好的选择。

6

使用列表推导式

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的回答。

撰写回答