我有一个字典列表,如果关键价格值等于''
,我想更新关键'价格'的值为0data=[a['price']=0 for a in data if a['price']=='']
有可能做那样的事吗?我也试过
a.update({'price':0})
但是效果不好......
答案 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"]]
没有钥匙"价格"如果0
为p["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
因此列表理解本身将返回无用的数据,但是您的字典将被更新。