繁体   English   中英

如何在 Python 中的 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM