我有一个带有一系列数字的文本文件,类似于这种格式:
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
Run Code Online (Sandbox Code Playgroud)
我想创建一个嵌套字典,将两个数字集合中的第一个数字映射到第二个数字,并将所有这些数字映射到行号.因此,对于此示例中的前几个条目(第1行),它看起来像这样:
{1: {80: 982}, {163: 8164}, {170: 2620}}
Run Code Online (Sandbox Code Playgroud)
我不确定如何通过有限的文本解析功能来实现这一点.我会使用制表符和逗号分隔符作为分隔符吗?
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,
...
Run Code Online (Sandbox Code Playgroud)
这里:
int(tok[0]) 是行号;(... for t in tok[1:])迭代数字对,将每对分配t为一个字符串;t.split(',') 将每对分成2元组的字符串;map(int, ...) 将每个2元组的字符串转换为2元组的整数;(map(int, t.split(',')) for t in tok[1:]) 是一个生成器表达式,逐个产生2元组的int;dict(...)将生成器的输出转换为字典.如果你发现任何这种混乱,我建议在交互式shell中试验代码,逐一剥离复杂程度.
| 归档时间: |
|
| 查看次数: |
70 次 |
| 最近记录: |