2017-03-28 6 views
2

私はdict1.txtというテキストファイルを2行含み、最初の文字列をキーに、2番目の文字列を値に付けるとします。テキストファイルはテキストファイルを辞書に変換する

abcdefghijklmnopqrstuvwxyz

gikaclmnqrpoxzybdefhjstuvw

であると私はいじるしてきたコードは次のとおりです。

def read_cipherdef(fn): 
d = {} 
fn = open('dict1.txt', 'r') 
for line in fn: 
    key, val = line.split() 
    d[(key)] = val 

が、この場合のline.split(で)実際に文字で最初の行を分割し、それはありませんValueError:アンパックする値が多すぎます(期待値2)。

また、私はlist(map(''.join, zip(*[iter('dict1.txt')]*1)))が個別に分割されることを認識していますが、既存のコードと組み合わせて使用​​することで別のValueErrorが得られます。だから私の質問は:どのように私はここですべての情報を一緒に私の希望の辞書を達成するために使用するだろうか?

ありがとうございました。

+0

どのように出力辞書が見えるでしょうか? – SuperSaiyan

+0

最終結果はどのように見えるでしょうか? – Jerfov2

+0

@SuperSaiyan偉大な考えは同じと思います – Jerfov2

答えて

4

これを実現できる方法が1つあります。本質的には、2つの行を読んで、それらを圧縮し、それらをdict-comprehensionで使用します。

>>> with open("/tmp/t") as f: 
...  line1 = f.readline().strip() 
...  line2 = f.readline().strip() 
...  print({x:y for x, y in zip(line1, line2)}) 
... 
{'a': 'g', 'b': 'i', 'c': 'k', 'd': 'a', 'e': 'c', 'f': 'l', 'g': 'm', 'h': 'n', 'i': 'q', 'j': 'r', 'k': 'p', 'l': 'o', 'm': 'x', 'n': 'z', 'o': 'y', 'p': 'b', 'q': 'd', 'r': 'e', 's': 'f', 't': 'h', 'u': 'j', 'v': 's', 'w': 't', 'x': 'u', 'y': 'v', 'z': 'w'} 

...それとも、ワンライナーをしたい場合(これは、ファイル内の唯一の2行があると仮定し):あなたは、また、この方法のようにそれを行うことができます

>>> with open("/tmp/t") as f: 
...  print({x: y for x, y in zip(*[list(x.strip()) for x in f])}) 
... 
{'a': 'g', 'b': 'i', 'c': 'k', 'd': 'a', 'e': 'c', 'f': 'l', 'g': 'm', 'h': 'n', 'i': 'q', 'j': 'r', 'k': 'p', 'l': 'o', 'm': 'x', 'n': 'z', 'o': 'y', 'p': 'b', 'q': 'd', 'r': 'e', 's': 'f', 't': 'h', 'u': 'j', 'v': 's', 'w': 't', 'x': 'u', 'y': 'v', 'z': 'w'} 
1

data = (k.rstrip() for k in open("dict1.txt", 'r')) 
a = {k:v for k,v in zip(*data)} 
print(a) 

それとも、1行で:

a = {k:v for k,v in zip(*(k.rstrip() for k in open("dict1.txt", 'r')))} 
print(a) 

Outpu T:代わりに理解の

{'a': 'g', 'y': 'v', 'k': 'p', 'j': 'r', 'f': 'l', 'g': 'm', 'o': 'y', 'r': 'e', 's': 'f', 'b': 'i', 'e': 'c', 'u': 'j', 't': 'h', 'z': 'w', 'l': 'o', 'c': 'k', 'h': 'n', 'i': 'q', 'n': 'z', 'd': 'a', 'w': 't', 'x': 'u', 'v': 's', 'm': 'x', 'p': 'b', 'q': 'd'} 
1

あなたは直接のdictを使用することができます。

dict(zip(*open('dict1.txt', 'rt').read().strip().split())) 

出力:これについて

{'a': 'g', 'b': 'i', 'c': 'k', 'd': 'a', 'e': 'c', 'f': 'l', 'g': 'm', 'h': 'n', 'i': 'q', 'j': 'r', 'k': 'p', 'l': 'o', 'm': 'x', 'n': 'z', 'o': 'y', 'p': 'b', 'q': 'd', 'r': 'e', 's': 'f', 't': 'h', 'u': 'j', 'v': 's', 'w': 't', 'x': 'u', 'y': 'v', 'z': 'w'} 
2

どのように?

with open('dict1.txt') as f: 
    lines=[line.strip('\n') for line in f.readlines()] 
    d=dict(zip(lines[0],lines[1])) 

from pprint import pprint 
pprint(d) 

結果:

{'a': 'g', 
'b': 'i', 
'c': 'k', 
'd': 'a', 
'e': 'c', 
'f': 'l', 
'g': 'm', 
'h': 'n', 
'i': 'q', 
'j': 'r', 
'k': 'p', 
'l': 'o', 
'm': 'x', 
'n': 'z', 
'o': 'y', 
'p': 'b', 
'q': 'd', 
'r': 'e', 
's': 'f', 
't': 'h', 
'u': 'j', 
'v': 's', 
'w': 't', 
'x': 'u', 
'y': 'v', 
'z': 'w'} 
関連する問題