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

How to split one specific nested list element in list of lists and write to new list as two elements

提问人:bashSudo 提问时间:6/28/2023 最后编辑:BeRT2mebashSudo 更新时间:6/28/2023 访问量:49

问:

我有一些非常混乱的 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']]

我特别需要拆分每个嵌套列表的最后一个元素( 将是索引,它始终是嵌套列表的第 4 个索引,在 上,并且仅在该字段中,因为其他元素有时可能包含并且我不想拆分它们,给我留下两个新元素,例如 并且仍然适当地与匹配数据一起列出。然后我会写这个新列表:result_list[n][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('-'))
python json csv 嵌套列表 python-3.10

评论


答:

-2赞 Joey Smith 6/28/2023 #1

你可能并不需要太在意它是一个列表,所以你可以只使用一个简单的列表组合;用作原始列表的名称,它看起来像这样:s

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

评论

0赞 Zach Young 6/28/2023
嗨,乔伊。 不存在于列表中(不过,它确实存在于 str 上)。partition
0赞 BeRT2me 6/28/2023 #2
  • 取除最后一个元素之外的所有元素x[:-1]
  • 拆分最后一个元素x[-1].split('-', 1)
  • 将这两个列表展开为一个列表,每个列表都包含 for each。*
result_list = [[*x[:-1], *x[-1].split('-', 1)] for x in result_list]
-1赞 richard 6/28/2023 #3

如果没有索引数据,则将该行保留在原位。

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

评论

0赞 Zach Young 6/28/2023
该循环实际上不会修改result_list内部的元素。您需要执行类似 的操作,然后在 if 语句中执行操作,并在更改列的值后执行 .for i, columns in enumerate(result_list):result_list[i] = columns