我有一个像这样的词典列表:
[{'value': 'apple', 'blah': 2},
{'value': 'banana', 'blah': 3} ,
{'value': 'cars', 'blah': 4}]
我想要['apple', 'banana', 'cars']
最好的办法是什么?
答案 0 :(得分:227)
假设每个dict都有一个value
键,你可以写(假设你的列表名为l
)
[d['value'] for d in l]
如果value
可能丢失,可以使用
[d['value'] for d in l if 'value' in d]
答案 1 :(得分:26)
这是使用map()和lambda函数执行此操作的另一种方法:
>>> map(lambda d: d['value'], l)
其中l是列表。 我认为这种方式“最性感”,但我会使用列表理解来做到这一点。
更新: 如果关键用途可能缺少“价值”:
>>> map(lambda d: d.get('value', 'default value'), l)
更新:我也不是lambdas的忠实粉丝,我更喜欢为事物命名......这就是我想要这样做的原因:
>>> import operator
>>> map(operator.itemgetter('value'), l)
我甚至会更进一步,创建一个明确说明我想要实现的唯一功能:
>>> import operator, functools
>>> get_values = functools.partial(map, operator.itemgetter('value'))
>>> get_values(l)
... [<list of values>]
使用Python 3,因为map
返回一个迭代器,所以使用list
返回一个列表,例如list(map(operator.itemgetter('value'), l))
。
答案 2 :(得分:15)
[x['value'] for x in list_of_dicts]
答案 3 :(得分:3)
对于这样一个非常简单的案例,理解就像在Ismail Badawi's answer中一样,绝对是可行的方法。
但是当事情变得更加复杂,并且你需要开始编写带有复杂表达式的多子句或嵌套式理解时,值得研究其他选择。有几种不同的(准)标准方法可以在嵌套的dict-and-list结构上指定XPath样式的搜索,例如JSONPath,DPath和KVC。 PyPI上有很好的库。
这是一个名为dpath
的库的示例,展示了它如何简化某些更复杂的事情:
>>> dd = {
... 'fruits': [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}],
... 'vehicles': [{'value': 'cars', 'blah':4}]}
>>> {key: [{'value': d['value']} for d in value] for key, value in dd.items()}
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
>>> dpath.util.search(dd, '*/*/value')
{'fruits': [{'value': 'apple'}, {'value': 'banana'}],
'vehicles': [{'value': 'cars'}]}
或者,使用jsonpath-ng
:
>>> [d['value'] for key, value in dd.items() for d in value]
['apple', 'banana', 'cars']
>>> [m.value for m in jsonpath_ng.parse('*.[*].value').find(dd)]
['apple', 'banana', 'cars']
这个看起来可能看起来不那么简单,因为find
返回匹配对象,除了匹配的值之外还包括各种事物,例如直接指向每个项目的路径。但是对于更复杂的表达式,能够为每个'*.[*].value'
指定类似*
的路径而不是理解子句可以产生很大的不同。另外,JSONPath是一种与语言无关的规范,甚至还有online testers可以非常方便地进行调试。
答案 4 :(得分:1)
我认为,如下所示的简单操作即可满足您的需求。
In[5]: ll = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}]
In[6]: ld = [d.get('value', None) for d in ll]
In[7]: ld
Out[7]: ['apple', 'banana', 'cars']
您也可以结合使用map
和lambda
来做到这一点,但是列表理解看起来更加优雅和Python化。
对于较小的输入列表,理解是一种方法,但是如果输入确实很大,那么我认为生成器是理想的方法。
In[11]: gd = (d.get('value', None) for d in ll)
In[12]: gd
Out[12]: <generator object <genexpr> at 0x7f5774568b10>
In[13]: '-'.join(gd)
Out[13]: 'apple-banana-cars'
这里是所有更大输入的所有可能解决方案的比较
In[2]: l = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value': 'cars', 'blah':4}] * 9000000
In[3]: def gen_version():
...: for i in l:
...: yield i.get('value', None)
...:
In[4]: def list_comp_verison():
...: return [i.get('value', None) for i in l]
...:
In[5]: def list_verison():
...: ll = []
...: for i in l:
...: ll.append(i.get('value', None))
...: return ll
In[10]: def map_lambda_version():
...: m = map(lambda i:i.get('value', None), l)
...: return m
...:
In[11]: %timeit gen_version()
172 ns ± 0.393 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In[12]: %timeit map_lambda_version()
203 ns ± 2.31 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In[13]: %timeit list_comp_verison()
1.61 s ± 20.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In[14]: %timeit list_verison()
2.29 s ± 4.58 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
如您所见,与其他生成器相比,生成器是更好的解决方案,与生成器相比,map的运行速度也较慢,原因是我将留给OP来解决。
答案 5 :(得分:1)
从python词典列表中获取键值吗?
例如:
data =
[{'obj1':[{'cpu_percentage':'15%','ram':3,'memory_percentage':'66%'}]},
{'obj2': [{'cpu_percentage':'0','ram':4,'memory_percentage':'35%'}]}]
用于数据:
for key,value in d.items():
z ={key: {'cpu_percentage': d['cpu_percentage'],'memory_percentage': d['memory_percentage']} for d in value}
print(z)
输出:
{'obj1': {'cpu_percentage': '15%', 'memory_percentage': '66%'}}
{'obj2': {'cpu_percentage': '0', 'memory_percentage': '35%'}}
答案 6 :(得分:0)
一种非常简单的方法是:
list1=['']
j=0
for i in com_list:
if j==0:
list1[0]=(i['value'])
else:
list1.append(i['value'])
j+=1
输出:
['苹果','香蕉','汽车']
答案 7 :(得分:0)
按照示例-
songs = [
{"title": "happy birthday", "playcount": 4},
{"title": "AC/DC", "playcount": 2},
{"title": "Billie Jean", "playcount": 6},
{"title": "Human Touch", "playcount": 3}
]
print("===========================")
print(f'Songs --> {songs} \n')
title = list(map(lambda x : x['title'], songs))
print(f'Print Title --> {title}')
playcount = list(map(lambda x : x['playcount'], songs))
print(f'Print Playcount --> {playcount}')
print (f'Print Sorted playcount --> {sorted(playcount)}')
# Aliter -
print(sorted(list(map(lambda x: x['playcount'],songs))))
答案 8 :(得分:-1)
请尝试这个。
d =[{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3} , {'value':
'cars', 'blah': 4}]
b=d[0]['value']
c=d[1]['value']
d=d[2]['value']
new_list=[b,c,d]
print(new_list)
输出:
['apple', 'banana', 'cars']