1

次のようなファイルがあります。

   Ben
   0 1 5 2 0 1 0 1
   Tim
   3 2 1 5 4 0 0 1

次のような辞書を作成したいと思います。

    {Ben: 0 1 5 2 0 1 0 1, Tim : 3 2 1 5 4 0 0 1}

だから私は次のようなことを考えていました:

   for line in file:
       dict[line] = line + 1

しかし、そのようなファイルを反復処理することはできません。

4

3 に答える 3

6

これはあなたが望むものかもしれません:

dict_data = {}
with open('data.txt') as f:
    for key in f:
        dict_data[key.strip()] = next(f).split()

print dict_data

出力:

{'ティム': ['3', '2', '1', '5', '4', '0', '0', '1'], 'ベン': ['0', '1 '、'5'、'2'、'0'、'1'、'0'、'1']}

討論

  • for ループは、各行がキーであると想定し、ループ本体の次の行を読み取ります。
  • key.strip()'Tim\n' を 'Tim' に変えます
  • f.next()次の行を読み取って返します -- キー行の後の行
  • f.next().split()したがって、その行をリストに分割します
  • dict_data[key.strip()] = ...次のようなことをします:dict_data['Tim'] = [ ... ]

アップデート

  • ポインタをくれたBlckknghtに感謝します。に変更f.next()しましたnext(f)

更新 2

リストを文字列ではなく整数のリストに変換する場合は、次の代わりに:

        dict_data[key.strip()] = next(f).split()

これを行う:

        dict_data[key.strip()] = [int(i) for i in next(f).split()]
于 2013-04-09T18:38:07.017 に答える
1
state = 0
d = {}
for line in file:
    if state == 0:
        key = line.strip()
        state = 1
    elif state == 1:
        d[key] = line.split()
        state = 0
于 2013-04-09T18:33:56.687 に答える
1

最も簡単な方法は、最初に でファイル全体をロードすることだと思います。これによりfile.readlines()、ファイル全体がロードされ、行のリストが返されます。次に、内包表記を使用して辞書を作成できます。

lines = my_file.readlines()
my_dict = dict(lines[i:i+2] for i in range(0, len(lines), 2))

サンプルファイルの場合、これmy_dictによりコンテンツが得られます。

{"Ben\n": "0 1 5 2 0 1 0 1\n", "Tim\n": "3 2 1 5 4 0 0 1\n"}

別のアプローチはwhile、一度に 2 行を読み取るループを使用することです。

my_dict = {}
while True:
    name = file.readline().strip()
    if not name: # detect the end of the file, where readline returns ""
        break
    numbers = [int(n) for n in file.readline().split()]
    my_dict[name] = numbers

このアプローチにより、以前のバージョンの理解よりも簡単に行の処理を行うことができます。たとえば、改行を削除したり、数字の行を実際のintオブジェクトのリストに分割したりできます。

サンプル ファイルの結果は次のようになります。

{"Ben": [0, 1, 5, 2, 0, 1, 0, 1], "Tim": [3, 2, 1, 5, 4, 0, 0, 1]}
于 2013-04-09T18:47:25.033 に答える