0

我有一个 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'])

但是有什么快速的单线方法吗?

4

4 回答 4

6

使用列表理解

mylist = [v['x'] for v in Mydict.values()]

由于您不需要外部键,因此您只需遍历内部 dicts,并获得所需的'x'值。

注意:这只有在每个内部字典都有一个'x'键时才有效,可以肯定的是,为了最大限度地减少错误,你可以这样做:

mylist = [v.get('x', None) for v in Mydict.values()]

这将起到相同的作用,只有当字典中没有'x'键时,它才会返回None而不是KeyError异常。

对于时间安排,并查看哪种方法最好,请查看Thorsten Kranz的答案

于 2013-02-05T09:02:48.057 回答
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

所以在这里节省键查找更好。

于 2013-02-05T09:08:06.193 回答
0

列表理解将是一行,并且几乎快两倍:

mylist = [mydict[k]['x'] for k in mydict]
于 2013-02-05T09:00:47.250 回答
0

使用列表推导

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

请注意,迭代会Mydict自动迭代键,因此无需迭代Mydict.keys()

于 2013-02-05T09:01:11.273 回答