使用python list comprehension来更新字典值

时间:2014-04-20 12:04:59

标签: python dictionary

我有一个字典列表,如果关键价格值等于''

,我想更新关键'价格'的值为0
data=[a['price']=0 for a in data if a['price']=='']

有可能做那样的事吗?我也试过

a.update({'price':0})

但是效果不好......

4 个答案:

答案 0 :(得分:19)

分配是语句,并且语句在列表推导中不可用。只需使用正常的for循环:

data = ...
for a in data:
    if a['price'] == '':
        a['price'] = 0

为了完整起见,你也可以使用这种可憎的东西(但这并不意味着你应该这样做):

data = ...

[a.__setitem__('price', 0 if a['price'] == '' else a['price']) for a in data]

答案 1 :(得分:2)

这是不好的做法,但可能:

import operator

l = [
    {'price': '', 'name': 'Banana'},
    {'price': 0.59, 'name': 'Apple'},
    {'name': 'Cookie', 'status': 'unavailable'}
]

[operator.setitem(p, "price", 0) for p in l if "price" in p and not p["price"]]

没有钥匙"价格"如果0p["price"],空字符串或python认为为False的任何其他值,则处理并将价格设置为False

请注意,列表推导会像[None]一样返回垃圾。

答案 2 :(得分:1)

如果您使用的是dict.update,请不要将其分配给原始变量,因为它会返回None

[a.update(price=0) for a in data if a['price']=='']

未分配内容将更新列表...

答案 3 :(得分:0)

是的。

您不能直接使用update来命令dict,因为update不返回任何内容,而dict在这种情况下(列表理解中)仅是临时变量,因此不会有任何影响,但是,您可以将其应用于可迭代本身,因为在这种情况下,可迭代是持久性变量。

代替使用

[my_dict['k'] = 'v' for my_dict in iterable]  # As I know, assignment not allowed in list comprehension

使用

[iterable[i].update({'k': 'v'}) for i in range(len(iterable))]  # You can use enumerate also

因此列表理解本身将返回无用的数据,但是您的字典将被更新。