1

私は現在、適切に考えることができない問題を抱えています

特定の形式でテキストファイルを読み取っている状況があります

(捕食者)食べる(獲物)

私がやろうとしているのはそれを辞書に入れることですが、の行が複数ある場合があります。

(捕食者)食べる(獲物)

同じ捕食者が別の獲物を食べるために現れるところ。

これまでのところ、これはどのように見えるかです...

import sys


predpraydic={}#Establish universial dictionary for predator and prey
openFile = open(sys.argv[1], "rt") # open the file

data = openFile.read() # read the file
data = data.rstrip('\n') #removes the empty line ahead of the last line of the file
predpraylist = data.split('\n') #splits the read file into a list by the new line character




for items in range (0, len(predpraylist)): #loop for every item in the list in attempt to split the values and give a list of lists that contains 2 values for every list, predator and prey
    predpraylist[items]=predpraylist[items].split("eats") #split "eats" to retrive the two values
    for predpray in range (0, 2): #loop for the 2 values in the list
        predpraylist[items][predpray]=predpraylist[items][predpray].strip() #removes the empty space caued by splitting the two values
for items in range (0, len(predpraylist)
    if 


for items in range (0, len(predpraylist)): # Loop in attempt to place these the listed items into a dictionary with a key of the predator to a list of prey
    predpraydic[predpraylist[items][0]] = predpraylist[items][1]

print(predpraydic)  
openFile.close() 

ご覧のとおり、私は単にフォーマットをリストにダンプし、それを辞書に変換しようとしています。

ただし、このメソッドはキーに対して1つの値のみを受け入れます。そして、私は次のような2つのものが欲しい

ライオンはシマウマを食べるライオンは犬を食べる

ある辞書を持っている

ライオン:['ゼブラ'、'犬']

私はこれを行う方法を考えることができません。どんな助けでもいただければ幸いです。

4

1 に答える 1

2

単一のアイテムではなく、追加するリストを含む辞書を作成するには、2 つの合理的な方法があります。1 つ目は、新しい値を追加する前に既存の値を確認することです。2 つ目は、必要に応じてリストを作成する、より洗練されたデータ構造を使用することです。

最初のアプローチの簡単な例を次に示します。

predpreydic = {}

with open(sys.argv[1]) as f:
    for line in f:
        pred, eats, prey = line.split() # splits on whitespace, so three values
        if pred in predpreydic:
            predpreydic[pred].append(prey)
        else:
            predpreydic[pred] = [prey]

この最初のアプローチのバリエーションは、if/elseブロックをディクショナリのもう少し微妙なメソッド呼び出しに置き換えます。

        predpreydic.setdefault(pred, []).append(prey)

このsetdefaultメソッドはpredpredic[pred]、まだ存在しない場合は空のリストに設定し、値 (新しい空のリストまたは以前の既存のリスト) を返します。これは、次の問題に対する他のアプローチと非常によく似ています。

私が言及した 2 番目のアプローチには、モジュール (Python 標準ライブラリの一部)defaultdictクラスが含まれます。collectionsこれは、まだ存在しないキーをリクエストするたびに新しいデフォルト値を作成するディクショナリです。必要に応じて値を作成するために、最初にdefaultdict.

これを使用すると、プログラムは次のようになります。

from collections import defaultdict

predpreydic = defaultdict(list) # the "list" constructor is our factory function

with open(sys.argv[1]) as f:
    for line in f:
        pred, eats, prey = line.split()
        predpreydic[pred].append(prey) #lists are created automatically as needed
于 2012-12-05T07:00:11.493 に答える