如何在列表中取消词典中的列表?

2024-07-02 13:19:55 发布

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

我有这样一份清单:

list = [{'item1': value1,
         'item2': [{'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}]},
        {'item3': [{'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32}],
         'item4': value4}]

我想要一个这样的列表:

list = [{'item1': value1,
         'item2': {'tinyitem21': tinyvalue21, 'tinyitem22': tinyvalue22}},
        {'item3': {'tinyitem31': tinyvalue31, 'tinyitem32': tinyvalue32},
         'item4': value4}]

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

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

有人能帮我吗


Tags: nameinnewfordictlistvalue1item1
3条回答

Python中的一行程序:

lt = [{'item1':'value1', 'item2':[{'tinyitem21':'tinyvalue21','tinyitem22':'tinyvalue22'}]}, {'item3':[{'tinyitem31':'tinyvalue31','tinyitem32':'tinyvalue32'}], 'item4': 'value4'}]

li = [{i:(j[0] if isinstance(j, list) and len(j) > 0 else j) for i,j in m.items()} for m in lt]

print(li)

产出:

[{'item1': 'value1', 'item2': {'tinyitem21': 'tinyvalue21', 'tinyitem22': 'tinyvalue22'}}, {'item3': {'tinyitem31': 'tinyvalue31', 'tinyitem32': 'tinyvalue32'}, 'item4': 'value4'}]

有关“如何在词典理解中使用if/else?”的信息,请参见this

您可以使用此功能(请注意,列表已在原地修改):

代码:

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

输出:

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

您也可以使用列表/听写理解:

>>> [{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}]

如果嵌套列表/目录多于一个级别,则可以使用此递归函数:

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

用法:

>>> 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'}]

下面是第一级嵌套转换的解决方案

import json

input_list = [{'item1':"value",'item2':[{'tinyitem21':'tinyvalue21','tinyitem22':'tinyvalue22'}]},{'item3':[{'tinyitem31':'tinyvalue31','tinyitem32':'tinyvalue32'}],'item4':'value4'}]

for index, j in enumerate(range(len(input_list))):
    for key, value in input_list[index].items():
        if isinstance(value, list) and len(value) == 1:  # Checking for single dictionary as multiple values of dict cannot considered as json
            input_list[index][key] = value[0]

print(json.dumps(input_list, indent=3))

输出:

[
   {
      "item1": "value",
      "item2": {
         "tinyitem21": "tinyvalue21",
         "tinyitem22": "tinyvalue22"
      }
   },
   {
      "item3": {
         "tinyitem31": "tinyvalue31",
         "tinyitem32": "tinyvalue32"
      },
      "item4": "value4"
   }
]

假设索引0处item2的值有多个dict,则应将其视为字符串值,如下面的输出所示

import json

input_list = [{'item1':"value",'item2':[{'tinyitem21':'tinyvalue21','tinyitem22':'tinyvalue22'},{'tinyitem23':'tinyvalue21','tinyitem24':'tinyvalue22'}]},{'item3':[{'tinyitem31':'tinyvalue31','tinyitem32':'tinyvalue32'}],'item4':'value4'}]


for index, j in enumerate(range(len(input_list))):
    for key, value in input_list[index].items():
        if isinstance(value, list):  # without checking len of list
            input_list[index][key] = ','.join(map(str, value))  # string value be assigned instead of dictionary

print(json.dumps(input_list, indent=3))

输出将是string而不是dict,但如果您注意到item3是list的单个dict,但仍然被分配为str

[
   {
      "item1": "value",
      "item2": "{'tinyitem21': 'tinyvalue21', 'tinyitem22': 'tinyvalue22'},{'tinyitem23': 'tinyvalue21', 'tinyitem24': 'tinyvalue22'}"
   },
   {
      "item3": "{'tinyitem31': 'tinyvalue31', 'tinyitem32': 'tinyvalue32'}",
      "item4": "value4"
   }
]

使用一个/多个dict处理两个列表,具有更高的可读性

for index, j in enumerate(range(len(input_list))):
    for key, value in input_list[index].items():
        if isinstance(value, list) and len(value) == 1:  # Checking for single dictionary as multiple values of dict cannot considered as json
            input_list[index][key] = value[0]
        if isinstance(value, list) and len(value) > 1:  # for list of dict with more than one 
            input_list[index][key] = ','.join(map(str, value))  # string value be assigned instead of dictionary

如果您想使用CDJB提到的综合方法,您需要在其中添加一个条件,因为如果列表大小大于1,它将自动忽略第二个索引

[{k: v[0] if isinstance(v, list) and len(v) == 1 else v for k, v in d.items()} for d in input_list]

输出:

[
   {
      "item1": "value",
      "item2": "{'tinyitem21': 'tinyvalue21', 'tinyitem22': 'tinyvalue22'},{'tinyitem23': 'tinyvalue21', 'tinyitem24': 'tinyvalue22'}"
   },
   {
      "item3": {
         "tinyitem31": "tinyvalue31",
         "tinyitem32": "tinyvalue32"
      },
      "item4": "value4"
   }
]

相关问题 更多 >