使用Python列表推导更新字典值
我有一个字典的列表,想把键'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]