我有一个带有一系列数字的文本文件,类似于这种格式:
1 80,982 163,8164 170,2620 145,648 200,8021 173,2069 92,647 26,4122 140,546 11,1913 160,6461 27,7905 40,9047 150,2183 61,9146 159,7420 198,1724 114,508 104,6647 30,4612 99,2367 138,7896 169,8700 49,2437 125,2909 117,2597 55,6399
我想创建一个嵌套字典,将两个数字集合中的第一个数字映射到第二个数字,并将所有数字映射到行号。因此,对于此示例中的前几个条目(第1行),它看起来像这样:
{1: {80: 982}, {163: 8164}, {170: 2620}}
我不确定如何通过有限的文本解析功能实现这一目标。我会使用制表符和逗号分隔符作为分隔符吗?
答案 0 :(得分:5)
In [32]: line = '1 80,982 163,8164 170,2620 145,648 200,8021 173,2069 92,647 26,4122 140,546 11,1913 160,6461 27,7905 40,9047 150,2183 61,9146 159,7420 198,1724 114,508 104,6647 30,4612 99,2367 138,7896 169,8700 49,2437 125,2909 117,2597 55,6399'
In [33]: tok = line.split()
In [34]: {int(tok[0]): dict(map(int, t.split(',')) for t in tok[1:])}
Out[34]:
{1: {11: 1913,
26: 4122,
27: 7905,
30: 4612,
40: 9047,
49: 2437,
55: 6399,
61: 9146,
...
下面:
int(tok[0])
是行号; (... for t in tok[1:])
遍历数字对,将每对分配为t
作为字符串; t.split(',')
将每一对分成两元组的字符串; map(int, ...)
将每个2元组的字符串转换为2元组的整数; (map(int, t.split(',')) for t in tok[1:])
是一个生成器表达式,逐个生成2元组的int; dict(...)
将生成器的输出转换为字典。如果你发现任何这种混乱,我建议在交互式shell中试验代码,逐一剥离复杂程度。
答案 1 :(得分:1)
内部部件可以通过以下方式轻松转换:
dict([(int(i),int(j)) for (i,j) in [k.split(',') for k in a.split()[1:]]])
的
a = '1 80,982 163,8164 170,2620 145,648 200,8021 173,2069'
输出将是
{163: 8164, 200: 8021, 170: 2620, 173: 2069, 80: 982, 145: 648}
不确定第一个元素(参见上面的评论)