使用Python列表推导更新字典值

22 投票
6 回答
38969 浏览
提问于 2025-04-18 03:29

我有一个字典的列表,想把键'price'的值更新为0,前提是这个键的值等于空字符串''。

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

这样做可以吗?我也试过其他方法

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

但也没有成功...

6 个回答

1

字典推导式

data = [
    {'price': '', 'id': 0},
    {'price': 7, 'id': 1},
    {'price': 26, 'id': 2},
]
data = [{k: 0 for k in d if k == 'price'} if d['price'] == '' else d for d in data]
print(data)
[
    {'price': 0, 'id': 0},
    {'price': 7, 'id': 1},
    {'price': 26, 'id': 2},
]
1

当然可以。

你不能直接对字典使用 update,因为 update 不会返回任何东西,而在这个情况下,字典只是一个临时变量(在列表推导式里面),所以这样做不会有任何效果,但是,你可以对可迭代对象本身使用它,因为在这个情况下,可迭代对象是一个持久变量。

不要使用

[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

所以列表推导式本身会返回无用的数据,但你的字典会被更新。

1

这样做虽然不太好,但确实是可以的:

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

在没有“price”这个键的情况下,会进行处理,如果 p["price"]False、空字符串或者其他 Python 认为是 False 的值,那么价格就会被设置为 0

需要注意的是,这种列表推导式会返回一些没用的东西,比如 [None]

11

如果你在使用 dict.update 方法,记得不要把它的结果赋值回原来的变量,因为它返回的是 None,也就是没有任何值。

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

如果不进行赋值,它会直接更新这个字典……

36

赋值是语句,而语句在列表推导式中是不能使用的。你可以使用普通的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]

撰写回答