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 

2つの数値のセットの最初の数値を2番目の数値にマップし、そのすべてを行番号にマップするネストされた辞書を作成したいと思います。したがって、この例の最初のいくつかのエントリ(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 タプルを int の 2 タプルに変換します。
  • (map(int, t.split(',')) for t in tok[1:])int の 2 タプルを 1 つずつ生成するジェネレータ式です。
  • 最後にdict(...)、ジェネレーターの出力を辞書に変換します。

これがわかりにくい場合は、対話型シェルでコードを試し、複雑さのレベルを 1 つずつ剥がしていくようお勧めします。

于 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 に答える