解析一条线上的标签数字

时间:2012-11-26 15:27:40

标签: 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 

我想创建一个嵌套字典,将两个数字集合中的第一个数字映射到第二个数字,并将所有数字映射到行号。因此,对于此示例中的前几个条目(第1行),它看起来像这样:

{1: {80: 982}, {163: 8164}, {170: 2620}} 

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

2 个答案:

答案 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}

不确定第一个元素(参见上面的评论)