[英]How to assign key and values to a dictionary in Python using Lambda function?
[英]How to assign values in lambda function in Python?
我正在使用 lambda function 使我的代码优化和更快。 下面我写了一些function。
a = [{"objId":"5c077187fe506f8dd3589ce6","userid":"absurana","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD","userType":"User"},
{"objId":"5d9d7ce6fe506f11b275d01b","userid":"accheung","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD",,"userType":"User"},
{"objId":"5d9d7ce6fe506f11b275d01b","userid":"accheung","firstName":"Null","usrRole":"Software Quality User","lastName":"Null","tiles":"Potential CFD","userType":"User"}]
def function_apply(a):
for d in a:
if 'userid' in d:
d['UserId'] = d.pop('userid')
if 'userType' in d:
d['User Type'] = d.pop('userType')
if 'usrRole' in d:
d['Role'] = d.pop('usrRole')
if 'tiles' in d:
d['Tiles'] = d.pop('tiles')
return a
现在我想使用 map 在 lambda 中转换 function 以上相同的内容,但出现错误。 我怎么能做到这一点?
一种单行、简洁、pythonic 的方式:
mapping = {"userid": "UserId", "userType": "User Type", "usrRole": "Role", "tiles": "Tiles"}
def rename(x): return [{mapping.get(k, k):v for (k,v) in d.items()} for d in x]
请注意,使用lambda
不会提供任何计算时间增益。 关于可读性,标准def
是 function 定义的最预期调用。
>>> rename(a)
[{'objId': '5c077187fe506f8dd3589ce6',
'UserId': 'absurana',
'firstName': 'Null',
'Role': 'Software Quality User',
'lastName': 'Null',
'Tiles': 'Potential CFD',
'User Type': 'User'},
{'objId': '5d9d7ce6fe506f11b275d01b',
'UserId': 'accheung',
'firstName': 'Null',
'Role': 'Software Quality User',
'lastName': 'Null',
'Tiles': 'Potential CFD',
'User Type': 'User'},
{'objId': '5d9d7ce6fe506f11b275d01b',
'UserId': 'accheung',
'firstName': 'Null',
'Role': 'Software Quality User',
'lastName': 'Null',
'Tiles': 'Potential CFD',
'User Type': 'User'}]
你现在所拥有的就是尽可能高效。 如果您想减少代码的重复性,您可以执行类似的操作
key_map = {
'userid': 'UserId',
'userType': 'User Type',
'usrRole': 'Role',
'tiles': 'Tiles',
}
def function_apply(a):
for old, new in key_map.items():
for d in a:
if old in d:
d[new] = d.pop(old)
您需要一个可以应用于单个字典的 function,例如:
keys = [
('userid', 'UserId'), ('userType', 'User Type'),
('usrRole', 'Role'), ('tiles', 'Tiles'),
]
def rename_keys(dct):
for old, new in keys:
if old in dct:
dct[new] = dct.pop(old)
现在可以将此 function 应用于循环中的列表元素:
for d in a:
rename_keys(d)
使用map
来做到这一点,是相当没有意义的:
map(rename_keys, a)
它本身什么也不做,因为只有在迭代器被消耗后,更改才会生效。 因此,您必须执行以下操作:
list(map(rename_keys, a))
# or
for _ in map(rename_keys, a): pass
这说明了为什么你不应该这样做:一个创建了一个虚假的内存列表,另一个最终以循环结束。 如果您不使用 function 的返回值,请不要在map
或理解中使用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.