4

これは、私が今少し取り組んでいるプロジェクトの一部です。主に物事がどのように機能するかについての個人的な誤解が原因で、実際に書くことができるものと精神的な擬似コードを合成するのに苦労しています。

次のクラスを使用して、架空の果物屋の在庫を追跡しています。

class Fruit(object)
    def __init__(self,name,qty,price)
        self.color = str(color)
        self.qty = int(qty)
        self.price = float(price)

    def getName(self): return self.color
    def getQty(self): return self.qty
    def getPrice(self): return self.price
    def description(self): return self.color,self.qty,self.price

このクラスのオブジェクトは、辞書のキーの値としてインポートされます。各キーには複数の値がリストに格納されている可能性があり、辞書が印刷されると、次のようなものが返されます (読みやすくするために改行を入れています:)

Lemon: [(Yellow, 5, 2.99)]
Apple: [(Red, 10, 0.99), (Green, 9, 0.69)]
Cherry: [(White, 2, 5.99),(Red, 5, 5.99)]

私は今、架空の果物スタンドにあるすべての果物の合計値を取得しようとしています. 私の最初の考えは、各値をリストとして扱い、整数に達するまでリストを反復処理し、その整数にそのすぐ後ろのインデックスの浮動小数点数を掛けてから、その量を現在の合計を持つ変数に追加することでした。次に、別の整数を探し続けます。リスト「チェリー」の「インデックス1」が(2)ではなく(赤、5、5.99)ではない場合、これはうまく機能します。

それで、いくつか質問があります。

  1. すべてクラスオブジェクトである複数の値を持つ辞書があるこのようなことをするたびに、各値は括弧として保存されます(それを呼び出すためのより良いものがないため)。それは起こっているべきことですか、または自分がやっていることのやり方を再評価する必要がありますか?

  2. ここで自分の選択を再評価する必要がない場合、「括弧」を分解して(すぐに頭に浮かぶより良いものがないため)、全体を扱うことができる方法はありますか?リスト?

  3. リストを繰り返し処理する必要のない、やりたいことを行うためのより良い方法はありますか?

前もって感謝します。私はこの問題のさまざまな部分と 1 週間格闘してきました。

4

3 に答える 3

6

次のような辞書を想定します。

fruit_stand = {
    "Lemon": [(Yellow, 5, 2.99)],
    "Apple": [(Red, 10, 0.99), (Green, 9, 0.69)],
    "Cherry": [(White, 2, 5.99),(Red, 5, 5.99)]
}

実際には、辞書を反復処理してそのキーを取得できます。

for fruit_name in fruit_stand:
    print fruit_name

# Lemon
# Apple
# Cherry
# NOTE: Order not guaranteed
# Cherry, Lemon, Apple are equally likely

次に、辞書のメソッドを使用して、ペアitemsのタプル (「括弧」と呼んでいるもの) を取得できます。keyvalue

for fruit_name, fruits in fruit_stand.items():
    print fruit_name, "=>", fruits

# Lemon => [(Yellow, 5, 2.99)]
# Apple => [(Red, 10, 0.99), (Green, 9, 0.69)]
# Cherry => [(White, 2, 5.99),(Red, 5, 5.99)]

lists (かっこで囲まれた[]) も反復可能です。

for fruit in [(White, 2, 5.99),(Red, 5, 5.99)]:
    print fruit

# (White, 2, 5.99)
# (Red, 5, 5.99)

したがって、各fruitsリストを操作して、次のようにアクセスできますtuple

for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for fruit in fruit_list:
        print fruit

で見たように、itemsタプルを複数の値にアンパックできます。

x, y = (1, 2)
print x
print y
# 1
# 2

したがって、それぞれfruitをコンポーネント パーツに展開できます。

for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for color, quantity, cost in fruit_list:
        print color, quantity, cost

そして、合計を取得することは難しくありません。

# We need to store our value somewhere
total_value = 0
for fruit_name, fruit_list in fruit_stand.items():
    # Ignore fruit_name and iterate over the fruits in fruit_list
    for color, quantity, cost in fruit_list:
        total_value += (quantity * cost)

print total_value

そうは言っても、物事を行うためのはるかに明確な方法があります。

  1. リスト内包表記を使用して、forループを単純化できます。

    for fruit_name in fruit_stand
        operation(fruit_name)
    

    このリスト内包表記に変換できます。

    [operation(fruit_name) for fruit_name in fruit_stand]
    

    したがって、ネストされたforループを次のように変換できます。

    sum([cost * quantity \  # Final operation goes in front
        for _, fruits in fruit_stand.items() \
            for _, cost, quantity in fruits])
    

    リストは実際には必要ないので、リストを取り除くことができ、代わりに Python がジェネレーターを作成します。

    sum(cost * quantity \  # Note the missing []
        for _, fruits in fruit_stand.items() \
            for _, cost, quantity in fruits)
    
  2. __add__メソッドを追加しFruitて、2 つのセットの果物を一緒に追加すると、両方のセットの合計コストが得られますFruit(ただし、おそらくそれを行うために中間データ構造を作成することをお勧めBasketFruitますquantity。のFruitインスタンスが固有量 1 を持つという意味を除けば、実際には に属していませんFruit。このオプションのコードは省略します。

于 2013-05-01T01:38:12.683 に答える