0

取引が 2 回以上選択されているかどうかを調べたいと思います。

次の例は、読みやすくするために省略されています。しかし、本質的には、ディクショナリを使用するのが最善の解決策であると考えていました。また、ディール コンテナー (deal_pot_1 など) に同じディールが 2 回以上含まれている場合は、エラーとしてキャプチャします。

次のコードはうまく機能しましたが、それ自体で例外がスローされます...

    if deal_pot_1:
       duplicates[deal_pot_1.pk] += 1

    if deal_pot_2:
        duplicates[deal_pot_2.pk] += 1

    if deal_pot_3:
        duplicates[deal_pot_3.pk] += 1

...次のように事前にこれを初期化しなかった場合。

    if deal_pot_1:
       duplicates[deal_pot_1.pk] = 0

    if deal_pot_2:
        duplicates[deal_pot_2.pk] = 0

    if deal_pot_3:
        duplicates[deal_pot_3.pk] = 0

これを単純化/結合する方法はありますか?

4

5 に答える 5

3

基本的に 2 つのオプションがあります。

  1. を使用しcollections.defaultdict(int)ます。未知のキーにアクセスすると、対応する値を 0 に初期化します。

  2. 辞書dの場合、次のことができます

    d[x] = d.get(x, 0) + 1
    

    単一のステートメントで初期化およびインクリメントします。

編集collections.Counter: Mark Byersが指摘したように、3番目のオプションはです。

于 2012-07-25T23:17:41.987 に答える
3

ご希望のようですcollections.Counter

于 2012-07-25T23:18:20.160 に答える
1

重複した値があるかどうかだけを知りたいですか? 次に、セットを使用できます:

duplicates = set()
for value in values:
    if value in duplicates():
        raise Exception('Duplicate!')
    duplicates.add(value)

重複したものをすべて見つけたい場合:

maybe_duplicates = set()
confirmed_duplicates = set()

for value in values:
    if value in maybe_duplicates():
        confirmed_duplicates.add(value)
    else:
        maybe_duplicates.add(value)

if confirmed_duplicates:
    raise Exception('Duplicates: ' + ', '.join(map(str, confirmed_duplicates)))
于 2012-07-25T23:21:40.190 に答える
1

collections.defaultdictを見てください。ご希望のようですdefaultdict(int)

于 2012-07-25T23:17:20.450 に答える
0

ここではおそらくセットを使用します。collections.defaultdict はおそらく必要以上のものです。

ハンドの正規の順序を考え出すことを忘れないでください。たとえば、カードをスーツと額面の値で小さいものから大きいものへと並べ替えます。そうしないと、一部の重複を検出できない可能性があります。

于 2012-07-26T00:19:50.577 に答える