2017-04-16 3 views
1

私は次のようになりtxt読みしようとしている:に、パイソン

Animals 
Dog 
Cat 
Bird 
Cities 
Paris 
London 
Chicago 

を辞書。 (キーへの最初の行は値の3行が続き、など)このようなことが見てしなければならない何かが:

{"Animals":["Dog","Cat","Bird"],"Cities":["Paris","London","Chicago"] 

私を助けてください!

+1

何を試しましたか?あなたの試みであなたを困惑させるのは何ですか? – abccd

+0

すでにコードがありますか?私たちはあなたが立ち往生したときに助けても構いませんが、一般的にあなたのプログラム全体を書くのは嫌です! –

+0

データは、常に3つの対応する値を持つ特定のタイプのペアで並べられていますか? – Ajax1234

答えて

0
import itertools 

d = {} 

with open("C:\path\to\text.txt", "r") as f: 
    lines = f.readlines() 

    # Separate keys from values 
    keys = itertools.islice(lines, 0, None, 4) 
    first_values = itertools.islice(lines, 1, None, 4) 
    second_values = itertools.islice(lines, 2, None, 4) 
    third_values = itertools.islice(lines, 3, None, 4) 

    # Set keys and values 
    for key in keys: 
     key = key.rstrip() 
     value1 = first_values.next().rstrip() 
     value2 = second_values.next().rstrip() 
     value3 = third_values.next().rstrip() 

     # Create dict 
     l = [value1, value2, value3] 
     d[key] = l 
0

これは動作するはずです:

ind = 0 
my_dict = {} 
my_list = [] 
for line in myfile: 
    val = line.rstrip().split()[0] 
    ind += 1 
    if ind % 5 == 0: 
     my_list = [] 
    if ind % 4 == 1: 
     x = val 
    else: 
     my_list.append(val) 

    if ind % 4 == 0: 
      my_dict[x] = my_list 

print(my_dict) 
1

をここでは、ファイルからの読み取りに次のn行を選択できますisliceを使用したソリューションは、です。 islice

+1

なぜf {'の行の' {line.strip():islice(s、3)のsのための[s.strip()]ですか? –

+0

それを考えなかった!ヒントありがとう! –

+1

また、ストリップコールを削除するpython3と仮定して、ストリップされた行を削除する、 'strip = map(str.strip、f); d = {行:リストされた(islice(ストリップされた、3))}できます。あなたのコードで 'map(str.rstrip、lines)'を使って醜いラムダを取り除くこともできます; –

0

{'Cities': ['Paris', 'London', 'Chicago'], 'Animals': ['Dog', 'Cat', 'Bird']}

もっとこのような何か試してください:あなたが必要とする結果が得られ

from itertools import islice 

dic = {} 

with open('file.txt', 'r') as f: 
    while True: 
     lines = list(islice(f, 4)) 
     lines = map(str.rstrip, lines) 
     if not lines: 
      break 
     dic[lines[0]] = lines[1:] 

print dic 

ここ

f = open('first.txt').readlines() 
f = [i.strip('\n') for i in f] 
datafile = [i.split() for i in f] 


dct = {} 


for i in range(len(datafile)): 

    if i%4 == 0: 

     new_lst = datafile[i+1:i+4] 

     final_list = [b[0] for b in new_lst] 

     print datafile[i][0] 
     dct[datafile[i][0]] = final_list 




print dct 
+0

これは完全に合理的な解決策であり、以下のその他の解決策です。ダウンウォーターは彼の動機を説明できますか? – Ajax1234

+0

同じです!少なくとも彼らはあなたとあなたの解決策の問題を指摘しなければなりません。私はあなたの投票をアップしています。 – Peaceful

+0

同じです。ありがとうございました。 – Ajax1234

0

は、別の可能なソリューションです。

fin = open(f, 'rb') 

lines = [word.strip('\n') for word in fin.readlines()] 

keys = [word.strip('\n') for idx, word in enumerate(fin.readlines()) if idx%4 == 0] 

values = [lines[idx+1:idx+4] for idx, _ in enumerate(lines) if idx%4 == 0] 

d = dict(zip(keys, values)) 

{'Animals': ['Dog', 'Cat', 'Bird'], 'Cities': ['Paris', 'London', 'Chicago']}