0

これは課題のためのものです (ただし、提供された解決策を熟考し、実際にここで何かを学ばなければならないので、完全に頭を悩ませています. Python マニュアル、Daniweb、およびこちらを参照してください。これらの概念を統合する方法がわかりません。

テキストファイルからの入力がたくさんあります(下のようにしましょう)。各行の最初の項目は辞書のキーになり、後の3つの項目はクラス「Fruit」に入ります。ご想像のとおり、物事を説明することになります。

lemon?yellow?sour?not
lemon?yellow?sour?yes
orange?orange?sweet?yes
grape?purple?sweet?yes

このファイルから作成されたキー「レモン」が記述子「黄色の酸っぱい」と「黄色の酸っぱい」をリストとして返すようにしたいと思います。

class Fruit(object):
'''Describes fruits'''
    def __init__(self,color,flavor,tasty):
        self.color = color
        self.flavor = flavor
        self.tasty = tasty

    def getColor(self): return self.color
    def getFlavor(self): return self.flavor
    def getTasty(self): return self.tasty
    def description(self): return self.color,self.flavor,self.tasty

fruity = {}

for line in inputFile:   
    n,c,f,t = line.split('?')
    indFruit = fruit(c,f,t)
    fruity[n] = [fruit.description]

もちろん、ファイルがキー「レモン」を2回押すと、「黄色のサワーではない」が「黄色のサワーである」で上書きされます(つまり、書かれているように、想定されているすべてのことを行っているようです)する。)

だから私はそのレモンの問題を処理する方法に取り組んでいます. 私は試した:

fruity = {}
fruitlist = []

for line in inputFile:   
    n,c,f,t = line.split('?')
    indFruit = fruit(c,f,t)
    fruity[n] = fruitlist.append(indFruit)

生産する

{(lemon): none, (orange): none, (grape): none}

その後

fruity = {}
fruitlist = []

for line in inputFile:   
    n,c,f,t = line.split('?')
    indFruit = fruit(c,f,t)
    fruitlist.append(indFruit)
    fruity[n] = fruitlist

それが生成するので、これは少しやり過ぎです:

{(lemon): [(yellow, sour, not),(yellow,sour,yes),(orange,sweet,yes),(grape,sweet,yes)}

表示することである、私が望むことを行う方法を理解するのに苦労しています:

{(lemon): [(yellow, sour, not),(yellow,sour,yes)], (orange): [(orange, sweet, yes)]}
and so on.

前もって感謝します!

4

2 に答える 2

0

「lemon」などのキーワードをリストにマッピングする辞書の代わりに、 Fruitクラスの代わりにsetand has ("yellow", "sour", "not")or ("yellow", "sour", "yes")asにマッピングし、それらを set オブジェクトに追加します。tuple

このセットにより、固有のアイテムのみを確実に保持できます。後で何らかの理由でそれらをリストとして持つ必要があることがわかった場合は、単に呼び出しますlist(my_dict["lemon"])

カスタム クラスの使用に固執する場合は、クラスでメソッドを定義してFruit__hash__クラスをハッシュ可能にすることを検討してください。__hash__クラスでこれを行うには、値 (「yellow」など) を単純にタプルに集約し、が呼び出されたときにそのタプルのハッシュを返します。簡単で汚い方法です。必ずしも「Yellow」などの文字列ではなく、より複雑なデータ型である可能性がある場合は、格納する可能性のある値のハッシュを作成するより良い方法を調査することをお勧めします。

リストはハッシュ可能でないため、セットに追加される値をリストにすることはできないことに注意してください。__hash__これが、タプル (またはクラスのメソッドの定義) を提案した理由です。

また、ディクショナリ オブジェクトのsetdefault()およびget()メソッドが役立つ場合もあります。それらについては、Python のドキュメントまたは Google で調べることをお勧めします。

于 2013-04-27T02:55:11.440 に答える
0

それはあなたの最後の行です:

fruity[n] = fruitlist

これは、fruity[n] の値をリスト全体に設定しています。デフォルトの dict を使用するようなことをしたいと思うので、果物ごとに個別のリストを取得できます ( を使用することもできますがsetdefault、もっと読みやすくなりませんか?)

from collections import defaultdict
fruity = defaultdict(lambda : []) # new list for each item

#... at the end of your forloop
fruity[n].append(indFruit)

詳細については、 defaultdictのドキュメントを参照してください。独自の defaultdict を作成するか、最後の行を次のように切り替えるのも非常に簡単です。

 fruity.setdefault(n, [])
 fruity[n].append(indFruit)
于 2013-04-27T03:21:17.587 に答える