我在Python中有一个列表,其中包含一个“嵌套”字典。所以我的清单如下:
List = [{'entry' : {'Name' : 'Smith', 'Age' : 25}}, {'entry' : {'Name' : 'Mary', 'Age' : 28}}]
我想在不使用循环的情况下从列表中返回键'Name'的所有值。因此,如果我使用循环它可以工作,因为这适用于列表的单个条目。例如:List[0]['entry']['Name']
起作用并返回'Smith'。但是,我需要像List[:]['entry']['Name']
这样的东西,它应该返回一个List,其中包含条目'Smith'和'Mary'。这可能吗?
答案 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
返回一个生成器。