0

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

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

我不确定如何用我有限的文本解析能力来实现这一点。我会使用使用制表符和逗号作为分隔符的拆分方法吗?

4

2 回答 2

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(',')将每一对拆分为一个 2 元组的字符串;
  • map(int, ...)将每个 2 元组字符串转换为 2 元组整数;
  • (map(int, t.split(',')) for t in tok[1:])是一个生成器表达式,它一个一个地产生 2 个整数元组;
  • 最后,dict(...)将生成器的输出转换为字典。

如果您发现其中有任何令人困惑的地方,我建议您在交互式 shell 中试验代码,将复杂程度逐层剥离。

于 2012-11-26T15:33:04.280 回答
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}

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

于 2012-11-26T15:43:15.423 回答