2012-07-25 50 views
0

我想弄清楚是否有任何交易被选中两次或更多。如何在Python中结合初始化和字典赋值?

为了便于阅读,下面的示例被删除。但实质上我认为最好的解决方案是使用字典,并且每当任何交易容器(例如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 

反正有没有简化/结合呢?

回答

3

基本上有两种选择:

  1. 使用collections.defaultdict(int)。在一个未知的键访问,这将初始化correposnding值为0

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

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

    在一个单独的语句初始化和增量。

编辑:第三个选项是collections.Counter,由马克·拜尔斯指出。

+1

而第二个是什么? – Tadeck 2012-07-25 23:18:53

+0

不能得到第一个工作,但第二个为我工作的感谢。 – Houman 2012-07-26 13:03:04

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))) 
0

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

不要忘记为你的双手提供一个规范的顺序,比如按照西装和面值将卡片从最小到最大排序。否则,您可能无法检测到一些重复项目。