如何在列表中取消列出字典中的列表?

ros*_*ina 2 python dictionary for-loop list python-3.x

我有一个这样的列表:

list = [{'item1': value1,
         'item2': [{'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}]},
        {'item3': [{'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32}],
         'item4': value4}]
Run Code Online (Sandbox Code Playgroud)

我想要一个这样的列表:

list = [{'item1': value1,
         'item2': {'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}},
        {'item3': {'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32},
         'item4': value4}]
Run Code Online (Sandbox Code Playgroud)

我编写了下面的代码来尝试解决这个问题,但它不起作用:

for item in list:
    for smallitem, smallvalue in item:
        if type(smallvalue)=='list':
            new_dict= {}
            for tinyitem in smallvalue:
                name = tinyitem.pop('name')
                new_dict[name] = tinyitem
            smallvalue=new_dict
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

CDJ*_*DJB 5

您可以使用此函数(请注意,列表已就地修改):

代码:

def f(l):
    for d in l:
        for k, v in d.items():
            if isinstance(v, list):
                d[k] = v[0]
    return l
Run Code Online (Sandbox Code Playgroud)

输出:

>>> f(lst)
[{'item1': value1,
  'item2': {'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}},
 {'item3': {'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32},
  'item4': value4}]
Run Code Online (Sandbox Code Playgroud)

您还可以使用列表/字典理解:

>>> [{k: v[0] if isinstance(v, list) else v for k, v in d.items()} for d in lst]
[{'item1': value1,
  'item2': {'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}},
 {'item3': {'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32},
  'item4': value4}]
Run Code Online (Sandbox Code Playgroud)

如果您的嵌套列表/字典多于一层,您可以使用此递归函数:

def f(lst):
    return [recursive_function(d) for d in lst] 

def recursive_function(d):
    rv = {}
    for k, v in d.items():
        if isinstance(v, list):
            v = v[0]
            if isinstance(v, dict):
                v = recursive_function(v)
        rv[k] = v
    return rv
Run Code Online (Sandbox Code Playgroud)

用法:

>>> lst = [{'item1': value1,
            'item2': [{'tinyitem21': [{'tinyitem21': tinyvalue21,
                                       'tinyitem22': tinyvalue22}],
                       'tinyitem22': tinyvalue22}]},
           {'item3': [{'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32}],
            'item4': value4}]
>>> f(lst)
[{'item1': 'value1',
  'item2': {'tinyitem21': {'tinyitem21': tinyvalue21,
                           'tinyitem22': tinyvalue22},
            'tinyitem22': tinyvalue22}},
 {'item3': {'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32},
  'item4': value'}]
Run Code Online (Sandbox Code Playgroud)