从文本文件生成嵌套字典

Generating nested dictionary from a text file

我有一个包含以下文本的 sample.txt 文件。

abcd  10
abcd  1.1.1.1
abcd  2.2.2.2 
abcd  3.3.3.3 
wxyz  20 
wxyz  1.1.1.1 
wxyz  2.2.2.2 
wxyz  4.4.4.4

我想将每一行的不同值存储到具有特定键的字典中。

字典需要的输出是 -

details = { 
    "customer_names" : ["abcd", "wxyz"],
    "site_ids" : [10, 20],
    "neighbors" : [["1.1.1.1", "2.2.2.2", "3.3.3.3"], ["1.1.1.1", "2.2.2.2", "4.4.4.4"]]
}

以便可以针对每个具有不同站点 ID 和不同邻居的客户独立进行特定配置。

我尝试过使用不同的代码,但由于无法正确处理,最终将所有邻居加载到一个列表中。请帮我准备字典,在邻居键中包含单独的嵌套列表。

您可以使用 for 循环遍历数据,每当它找到以 customer_names 列表中不存在的 id 开头的行时,将其添加到列表以及开始填充相邻行的其他必要数据:

details = { 
    "customer_names" : [],
    "site_ids" : [],
    "neighbors" : []
}

with open("sample.txt") as f:
    for line in f:
        i, j = line.split()
        if i in details["customer_names"]:      # If id is in customer_names list
            details["neighbors"][-1].append(j)  # Add neighbor to last list in neighbors list
        else:                                   # Else
            details["customer_names"].append(i) # Add id to customer_names list
            details["neighbors"].append([])     # Add new list to end of neighbors list
            details["site_ids"].append(int(j))  # Add number to site_ids list

sample.txt 包含:

abcd  10
abcd  1.1.1.1
abcd  2.2.2.2 
abcd  3.3.3.3 
wxyz  20 
wxyz  1.1.1.1 
wxyz  2.2.2.2 
wxyz 4.4.4.4

结果 details 包含:

{'customer_names': ['abcd', 'wxyz'],
 'site_ids': [10, 20],
 'neighbors': [['1.1.1.1', '2.2.2.2', '3.3.3.3'], ['1.1.1.1', '2.2.2.2', '4.4.4.4']]}

我读取了文件中的数据并从中制作了一个数据框 (pandas)。这里首先得到有 int 值 10、20 的索引。 这些索引用于获取名称列表。 接下来,创建列表 aaa、bbb。

import pandas as pd

df = pd.read_csv('ttt.txt', header=None, delim_whitespace=True)

index = [i for i in range(0, len(df[1])) if df[1][i].isdigit()]#Getting an index where there are integers.
name  = df.iloc[index, 0].to_list()
aaa = df.loc[(df.index != index[0]) & (df.index != index[1]) & (df[0] == name[0])][1].to_list()
bbb = df.loc[(df.index != index[0]) & (df.index != index[1]) & (df[0] == name[1])][1].to_list()

details = {
    "customer_names": name,
    "site_ids": [int(df.iloc[index[0], 1]), int(df.iloc[index[1], 1])],
    "neighbors": [aaa, bbb]

输出详细信息

{'customer_names': ['abcd', 'wxyz'], 'site_ids': [10, 20], 'neighbors': [['1.1.1.1', '2.2.2.2', '3.3.3.3'], ['1.1.1.1', '2.2.2.2', '4.4.4.4']]}