0

我想知道是否有任何交易被选中两次或更多。

为了便于阅读,下面的例子被删减了。但从本质上讲,我认为最好的解决方案是使用字典,并且每当任何交易容器(例如 deal_pot_1)包含相同的交易两次​​或更多次时,我都会将其捕获为错误。

以下代码对我很有帮助,但是它本身会引发异常......

    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

基本上有两种选择:

  1. 使用collections.defaultdict(int). 在访问未知密钥时,它将相应的值初始化为 0。

  2. 对于字典d,你可以做

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

    在单个语句中初始化和递增。

编辑:第三个选项是collections.Counter,正如 Mark Byers 所指出的。

于 2012-07-25T23:17:41.987 回答
3

看起来像你想要collections.Counter的。

于 2012-07-25T23:18:20.160 回答
1

查看collections.defaultdict。看起来像你想要defaultdict(int)的。

于 2012-07-25T23:17:20.450 回答
1

所以你只想知道是否有重复的值?然后你可以使用一个set

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 回答
0

一套可能是去这里的方式 - collections.defaultdict 可能比你需要的要多。

不要忘记为你的牌制定一个规范的顺序——比如按照花色和面值从小到大对牌进行排序。否则,您可能无法检测到某些重复项。

于 2012-07-26T00:19:50.577 回答