4

私のファイルは次のようになります。

aaien 12 13 39
aan 10
aanbad 12 13 14 57 58 38
aanbaden 12 13 14 57 58 38
aanbeden 12 13 14 57 58 38
aanbid  12 13 14 57 58 39
aanbidden 12 13 14 57 58 39
aanbidt 12 13 14 57 58 39
aanblik 27 28
aanbreken 39
...

key =単語('aaien'など)で辞書を作成したいのですが、値はその隣にある数字のリストである必要があります。したがって、次のように表示する必要があります。{'aaien':['12、13、39']、' aan':['10']}

このコードは機能していないようです。

document = open('LIWC_words.txt', 'r')
liwcwords = document.read()
dictliwc = {}
for line in liwcwords:
    k, v = line.strip().split(' ')
    answer[k.strip()] = v.strip()

liwcwords.close()

Pythonはこのエラーを出します:

ValueError: need more than 1 value to unpack
4

2 に答える 2

9

行を単語のリストに分割していますが、キーと値を1つだけ指定しています。

これは機能します:

with open('LIWC_words.txt', 'r') as document:
    answer = {}
    for line in document:
        line = line.split()
        if not line:  # empty line?
            continue
        answer[line[0]] = line[1:]

.split()引数を与える必要はないことに注意してください。引数がないと、空白で分割され、結果が削除されます。これにより、明示的にを呼び出す必要がなくなります.strip()

別の方法は、最初の空白でのみ分割することです。

with open('LIWC_words.txt', 'r') as document:
    answer = {}
    for line in document:
        if line.strip():  # non-empty line?
            key, value = line.split(None, 1)  # None means 'all whitespace', the default
            answer[key] = value.split()

行われる分割の数を制限する2番目の引数.split()は、最大2つの要素が返されることを保証し、およびへの割り当ての値をアンパックできるようにしkeyますvalue

どちらの方法でも、次のようになります。

{'aaien': ['12', '13', '39'],
 'aan': ['10'],
 'aanbad': ['12', '13', '14', '57', '58', '38'],
 'aanbaden': ['12', '13', '14', '57', '58', '38'],
 'aanbeden': ['12', '13', '14', '57', '58', '38'],
 'aanbid': ['12', '13', '14', '57', '58', '39'],
 'aanbidden': ['12', '13', '14', '57', '58', '39'],
 'aanbidt': ['12', '13', '14', '57', '58', '39'],
 'aanblik': ['27', '28'],
 'aanbreken': ['39']}

それでもキーが1つだけで、ファイルの残りの部分が(分割)値として表示される場合は、入力ファイルで非標準の行区切り記号が使用されている可能性があります。モードに文字を追加して、ユニバーサルラインエンディングをサポートするファイルを開きます。U

with open('LIWC_words.txt', 'rU') as document:
于 2013-01-24T16:19:40.827 に答える
2
>liwcwords = document.read()  
>dictliwc = {}    
>for line in liwcwords:

ここで文字列を繰り返し処理していますが、これは必要なことではありません。試してみてくださいdocument.readlines()。これが別の解決策です。

from pprint import pprint
with open('LIWC_words.txt') as fd:
    d = {}
    for i in fd:
        entry = i.split()
        if entry: d.update({entry[0]: entry[1:]})

pprint(d)

出力は次のようになります

{'aaien': ['12', '13', '39'],
 'aan': ['10'],
 'aanbad': ['12', '13', '14', '57', '58', '38'],
 'aanbaden': ['12', '13', '14', '57', '58', '38'],
 'aanbeden': ['12', '13', '14', '57', '58', '38'],
 'aanbid': ['12', '13', '14', '57', '58', '39'],
 'aanbidden': ['12', '13', '14', '57', '58', '39'],
 'aanbidt': ['12', '13', '14', '57', '58', '39'],
 'aanblik': ['27', '28'],
 'aanbreken': ['39']}
于 2013-01-24T17:32:43.307 に答える