根据某些条件修改口述记录列表中的键

2024-10-03 06:24:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个用例,需要根据某些条件修改键名和键值。在JavaScript中,使用^{}非常简单

但在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,则值更改为truefalse

在一个简单的程序中,我可以这样做:

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的初学者,我想知道是否有类似Python的方法(lambda操作符、fnc或pydash)


Tags: falsetrueobjectaccessadminisusername用例
3条回答

这是经过一些修改的代码:

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)

或者更像Python的方式

processed_list = [{"is_admin": i["access_level"] == 50, 'username': i['username']}  for i in list_is]

您可以使用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'}]

这将创建一个具有所需dict格式的新列表,但是,原始列表的(list_is)内容将更改,因为会弹出access level键。正如@schwobasegll所指出的,最好不要创建单独的列表,因此您可以将列表理解分配回list_is

不管怎样,由于您正在修改dicts,因此创建一个新列表没有什么意义。只需使用一个循环dict.pop并在适当的位置执行即可:

for d in list_is:
    d["is_admin"] = d.pop("access_level") == 50

相关问题 更多 >