我有一个字典列表,像这样:

[{'value': 'apple', 'blah': 2}, 
 {'value': 'banana', 'blah': 3} , 
 {'value': 'cars', 'blah': 4}]

我想要['苹果','香蕉','汽车']

做这件事最好的方法是什么?


当前回答

下面是使用map()和lambda函数的另一种方法:

>>> map(lambda d: d['value'], l)

其中l是列表。 我这样看“最性感”,但我会用列表理解来做。

更新: 以防“value”作为键的使用可能会丢失:

>>> map(lambda d: d.get('value', 'default value'), l)

更新:我也不是lambdas的大粉丝,我更喜欢命名事物…这就是我的做法:

>>> import operator
>>> get_value = operator.itemgetter('value')
>>> map(get_value, l)

我甚至会进一步创建一个明确表示我想要实现的功能:

>>> import operator, functools
>>> get_value = operator.itemgetter('value')
>>> get_values = functools.partial(map, get_value)
>>> get_values(l)
... [<list of values>]

在Python 3中,由于map返回一个迭代器,所以使用list返回一个列表,例如list(map(operator.itemgetter('value'), l))。

其他回答

请试试这个。

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']

对于这样一个非常简单的例子,理解伊斯梅尔·巴达维的答案绝对是正确的。

但是,当事情变得更加复杂,并且需要开始编写包含复杂表达式的多子句或嵌套推导时,就值得考虑其他替代方案了。有几种不同的(准)标准方法可以在嵌套的字典和列表结构上指定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是一种语言不可知的规范,甚至有在线测试人员可以非常方便地进行调试。

一个非常简单的方法是:

list1=['']
j=0
for i in com_list:
    if j==0:
        list1[0]=(i['value'])
    else:
        list1.append(i['value'])
    j+=1

输出:

['apple', 'banana', 'cars']

下面是使用map()和lambda函数的另一种方法:

>>> map(lambda d: d['value'], l)

其中l是列表。 我这样看“最性感”,但我会用列表理解来做。

更新: 以防“value”作为键的使用可能会丢失:

>>> map(lambda d: d.get('value', 'default value'), l)

更新:我也不是lambdas的大粉丝,我更喜欢命名事物…这就是我的做法:

>>> import operator
>>> get_value = operator.itemgetter('value')
>>> map(get_value, l)

我甚至会进一步创建一个明确表示我想要实现的功能:

>>> import operator, functools
>>> get_value = operator.itemgetter('value')
>>> get_values = functools.partial(map, get_value)
>>> get_values(l)
... [<list of values>]

在Python 3中,由于map返回一个迭代器,所以使用list返回一个列表,例如list(map(operator.itemgetter('value'), l))。

使用列表推导式

输入:

d = [{'value': 'apple', 'blah': 2}, {'value': 'banana', 'blah': 3}, {'value': 'cars', 'blah': 4}]
    
        
values = [i['value'] for i in d]

print(values)

输出:

['apple', 'banana', 'cars']