我有一个用例,我需要根据某些条件修改键名和值。在 JavaScript 中,使用 lodash lib
非常简单。
但在 Python 中我没有找到这样的库。
输入:
list_is = [{'access_level': 20, 'username': 'example1'},
{'access_level': 50, 'username': 'example2'}]
输出:
[{'is_admin': false, 'username': 'example1'},
{'is_admin': true, 'username': 'example2'}]
请注意,这里的键 access_level
更改为 is_admin
,如果 access_level
= 50
然后 true
否则 false
.
在一个简单的程序中,我可以做这样的事情:
processed_list = []
for i in range(len(list_is)):
processed_object = {}
processed_object[username] = list_is[i]['username']
processed_object[is_admin] = list_is[i]['access_level'] == 50 ? true : false
processed_list.append(processed_object)
return processed_list
但由于我是 Python 的初学者,我想知道是否有 Pythonic 的方法(lambda 运算符、fnc 或 pydash)。
答案 0 :(得分:3)
无论如何,由于您正在改变字典,因此创建新列表毫无意义。只需使用循环 dict.pop
并就地执行:
for d in list_is:
d["is_admin"] = d.pop("access_level") == 50
答案 1 :(得分:2)
您可以使用list_comprehension
:
>>> output = [dict(
[('is_admin', v==50) if k=='access_level' else (k, v)
for k,v in elem.items()]
)
for elem in list_is]
>>> output
[{'is_admin': False, 'username': 'example1'},
{'is_admin': True, 'username': 'example2'}]
或者,
>>> output = [{'is_admin': elem.pop('access_level')==50, **elem} for elem in list_is]
>>> output
[{'is_admin': False, 'username': 'example1'},
{'is_admin': True, 'username': 'example2'}]
这将创建一个具有所需字典格式的新列表,但是,原始列表的 (list_is
) 内容将被更改,因为 access level
键将被弹出。因此,正如@schwobaseggl 所指出的,最好不要创建单独的列表,而是可以将列表推导式分配回 list_is
。
答案 2 :(得分:0)
这是经过一些修改的代码:
def make_smth(list_is):
processed_list = []
for i in range(len(list_is)):
processed_object = {}
processed_object["username"] = list_is[i]['username']
processed_object["is_admin"] = list_is[i]['access_level'] == 50
processed_list.append(processed_object)
return processed_list
make_smth(list_is)
或者更多pythonic方式
processed_list = [{"is_admin": i["access_level"] == 50, 'username': i['username']} for i in list_is]