解析一条线上的标签数字

use*_*661 0 python

我有一个带有一系列数字的文本文件,类似于这种格式:

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)

我不确定如何通过有限的文本解析功能来实现这一点.我会使用制表符和逗号分隔符作为分隔符吗?

NPE*_*NPE 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,
  ...
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中试验代码,逐一剥离复杂程度.

  • @ user1427661 In/Out结构只是一个不同的python shell(ipython).'In'之后的内容是NPE输入的内容(类似于标准shell中的>>>),'Out'之后的内容是每行的输出(如果有的话). (2认同)