获取字典的python列表中某个键的所有值

时间:2016-11-24 15:49:08

标签: python dictionary

我在Python中有一个列表,其中包含一个“嵌套”字典。所以我的清单如下:

List = [{'entry' : {'Name' : 'Smith', 'Age' : 25}}, {'entry' : {'Name' : 'Mary', 'Age' : 28}}]

我想在不使用循环的情况下从列表中返回键'Name'的所有值。因此,如果我使用循环它可以工作,因为这适用于列表的单个条目。例如:List[0]['entry']['Name']起作用并返回'Smith'。但是,我需要像List[:]['entry']['Name']这样的东西,它应该返回一个List,其中包含条目'Smith'和'Mary'。这可能吗?

5 个答案:

答案 0 :(得分:5)

您可以lambda expression使用map()作为:

>>> map(lambda d: d['entry']['Name'], List)
['Smith', 'Mary']

即使您没有在此处看到循环,但内部map()也会在列表上进行迭代。您不能跳过遍历列表以实现您想要的目标。

更好的方法是将列表理解用作:

>>> [d['entry']['Name'] for d in List]
['Smith', 'Mary']

或者,如果嵌套字典中可能存在任何键丢失,则可以将过滤器添加为:

>>> [d['entry']['Name'] for d in List if 'entry' in d and 'Name' in d['entry']]
['Smith', 'Mary']

答案 1 :(得分:2)

您可以使用:

 [o['entry']['Name'] for o in List]

结果:['史密斯','玛丽']

请注意,它仍然是循环的。如果没有循环,你就无法做到这一点。

答案 2 :(得分:2)

不幸的是,这在python中是不可能的,尽管它将是一个非常有用的功能。类似的功能通常仅在特定于域的查询语言中可用(例如,我认为Django ORM支持类似的索引),但不能用于我能想到的任何通用语言。

你最好的方法是

[item['Entry']['Name'] for item in List]

答案 3 :(得分:2)

我不确定为什么你不能使用循环但列出理解工作?让我知道原因,也许我可以推荐别的东西。

a = [{'entry' : {'Name' : 'Smith', 'Age' : 25}}, {'entry' : {'Name' : 'Mary', 'Age' : 28}}]
b = [a[i]['entry']['Name'] for i in range(len(a))]

结果: b = [' Smith',' Mary']

答案 4 :(得分:2)

我发布了reduce()方法作为好奇心,但由于答案被接受,我发布了timeit结果,以便将效果与此故障单上的其他答案进行比较。

from timeit import timeit
import functools

def _reduce_py2(the_list):

    return reduce(lambda l, src: l.append(src['entry']['Name']) or l, the_list, [])

def _reduce_py3(the_list):

    return functools.reduce(lambda l, src: l.append(src['entry']['Name']) or l, the_list, [])

def _map_py2(the_list):

    return map(lambda d: d['entry']['Name'], the_list)

def _map_py3(the_list):

    return [i for i in map(lambda d: d['entry']['Name'], the_list)]

def _list(the_list):

    return [d['entry']['Name'] for d in the_list]

the_list = []
for i in range(1000):
    the_list += [{'entry' : {'Name' : 'Smith%s' % i, 'Age' : i}}]


reps = 1000

# Compare timings

print('Reduce:              ', timeit('c(the_list)', 'from __main__ import _reduce_py2 as c, the_list', number=reps))
print('Map:                 ', timeit('c(the_list)', 'from __main__ import _map_py2 as c, the_list', number=reps))
print('List comprehension:  ', timeit('c(the_list)', 'from __main__ import _list as c, the_list', number=reps))

结果:

Py 2
Reduce:               0.2090609073638916
Map:                  0.136185884475708
List comprehension:   0.07403087615966797

Py 3
Reduce:               0.20160907896934077
Map:                  0.17127344600157812
List comprehension:   0.06799810699885711

结论,list comprehension是最快的方法。但是,python 3上的map返回一个生成器。