python 如何在列表的列表中拆分一个特定的嵌套列表元素并将其作为两个元素写入新列表

rnmwe5a2  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(120)

我有一些非常混乱的JSON数据(使用蛮力和jmespath查询数据),我设法进入了一个列表列表。我需要获取每个嵌套列表的最后一个元素,并将其拆分为两个元素,以便将它们写入CSV文件以生成报告。该列表中的嵌套列表的数量可以是动态的,可以少至几百到几千或更多。
样品:
result_list是我以列表格式导入的JSON数据,例如,下面的列表中包含了三个列表,但同样,可以是数百个唯一值:

[['name_123', '00:00:A1', 8.23, '0.15', '55541-00:AA:11:BB:22:CC:33:DD'], 
 ['site3_name-DB', '00:01:B2', 124.03, '46.72', '86753-00:AA:22:CD:F8:63:D2:B3'], 
 ['LOG-SITE2_DB', '00:00:B3', 32.09, '20.34', '22234-00:AA:11:BB:CC:33:DD:44']]

我特别需要拆分每个嵌套列表的最后一个元素(result_list[n][4]将是索引,它总是嵌套列表的第4个索引,-上的12345-00:11:22:33:44:55:66:77,并且仅在该字段中的-上,因为其他元素有时可能包含-,我不想拆分它们,剩下两个新元素,如1234500:11:22:33:44:55:66:77,仍然适当地列出了匹配的数据。然后我会写下新的清单:

[['name_123', '00:00:A1', 8.23, '0.15', '55541', '00:AA:11:BB:22:CC:33:DD'], 
 ['site3_name-DB', '00:01:B2', 124.03, '46.72', '86753', '00:AA:22:CD:F8:63:D2:B3'], 
 ['LOG-SITE2_DB', '00:00:B3', 32.09, '20.34', '22234', '00:AA:11:BB:CC:33:DD:44']]

添加一些更像样的标题行后,将其转换为CSV文件。如果列表中有空白/无类型/等。对于我要拆分的字段,我想忽略它,这样它在最终CSV报告中仍然是空白,所以我需要跳过它。
我更喜欢在不使用Python 3.10中不包含的任何非标准包或模块的情况下做到这一点,但如果这是唯一的方法,那么就设法正确导入Pandas 2.0.2。我知道这是一个非常混乱的方式来处理这个JSON数据,但没有什么我可以做的,我必须与我有什么工作。
提前感谢您的耐心。在过去,我在处理这类东西时,有结构化数据库的奢侈品,但在这种情况下,我没有,我对Python相当熟悉。
当我尝试用for/if/else循环来做这件事时,我得到了列表索引超出范围的异常,我不知道如何处理,我不知道如何正确地将两个新的拆分元素附加到现有的列表或新的列表中,就像这样:

for i in result_list:
    if i[4] is None:
        print(" ")
    else:
        result_list.append(i[4].split('-'))
k10s72fa

k10s72fa1#

  • 取除最后一个元素x[:-1]之外的所有元素
  • 拆分最后一个元素x[-1].split('-', 1)
  • 将这两个列表展开为一个列表,每个列表都有*
result_list = [[*x[:-1], *x[-1].split('-', 1)] for x in result_list]
jhiyze9q

jhiyze9q2#

您可能不需要太在意它是一个列表,所以您可以使用一个简单的listcomp;使用s作为原始列表的名称,它看起来像:

writer = csv.writer(…)
writer.writerow([x[4].partition('-')[0::2] for x in s])
vxf3dgd4

vxf3dgd43#

如果没有索引数据,则保留该行。

result_list = [
    ['name_123', '00:00:A1', 8.23, '0.15', '55541-00:AA:11:BB:22:CC:33:DD'],
    ['name_123', '00:00:A1', 8.23, '0.15'],
    ['site3_name-DB', '00:01:B2', 124.03, '46.72', '86753-00:AA:22:CD:F8:63:D2:B3'],
    ['LOG-SITE2_DB', '00:00:B3', 32.09, '20.34', '22234-00:AA:11:BB:CC:33:DD:44'],
    ['LOG-SITE2_DB', '00:00:B3', 32.09, '20.34'],
    ]

for i, columns in enumerate(result_list):
    if len(columns) > 4:
        result_list[i] = columns[:3] + columns[4].split('-')

# [['name_123', '00:00:A1', 8.23, '55541', '00:AA:11:BB:22:CC:33:DD'],
#  ['name_123', '00:00:A1', 8.23, '0.15'],
#  ['site3_name-DB', '00:01:B2', 124.03, '86753', '00:AA:22:CD:F8:63:D2:B3'],
#  ['LOG-SITE2_DB', '00:00:B3', 32.09, '22234', '00:AA:11:BB:CC:33:DD:44'],
#  ['LOG-SITE2_DB', '00:00:B3', 32.09, '20.34']]

相关问题