根据某些条件修改字典列表中的键

时间:2021-02-03 08:36:04

标签: python python-3.x

我有一个用例,我需要根据某些条件修改键名和值。在 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)。

3 个答案:

答案 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]