从文本文件生成嵌套字典
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']]}
我有一个包含以下文本的 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']]}