如何使用字典中的多个列表跟踪卡片?

时间:2016-06-27 07:23:34

标签: python python-3.x python-3.4 python-3.5

我的代码如下:

import cards

def build_rank_D(H):
    dictionary = {}
    for i in range(0,len(H)):
        card = H[i]
        dictionary[card.rank()] = card
    return dictionary
c1 = cards.Card(7,1)
c2 = cards.Card(2,1)
c3 = cards.Card(7,2)
c4 = cards.Card(7,3)
c5 = cards.Card(2,3)
c6 = cards.Card(7,4)
c7 = cards.Card(3,4)
c8 = cards.Card(1,2)
H1 = [c1,c2,c3,c4,c5,c6,c7]
H2 = [c1,c2,c3,c4,c5,c7,c8]
print(build_rank_D(H1))

当前代码的输出是:

    "{2: 2h, 3: 3s, 7: 7s}"

应该是:

    "{2:[2c,2h], 3:[3s], 7:[7c,7d,7h,7s]}"

基本上,我正在尝试制作德州扑克游戏。必须检查7张牌(2张牌,桌上有5张公共牌)。我想创建一个函数来跟踪字典中的卡片,但我似乎无法理解为什么我的代码不是将其他卡片添加为列表,而是跳过它们并且每个键只填充1个。

顺便说一句:在c1 = cards.Card(7,1)和其他人中,这意味着这张牌是7个俱乐部。如果是c1 = cards.Card(7,2),那就意味着这张牌是7张心。 3是钻石。 4是铁锹。

2 个答案:

答案 0 :(得分:0)

dictionary[card.rank()] = card用新的替换该插槽中的所有内容。你不想要这个。您希望保留已存在的值,然后将下一张卡添加到其中。

之所以发生这种情况,是因为它并不关心dictionary[card.rank()]中已有的内容,它只是赋予它一个新值。由于您希望在同一个密钥中存储多个内容,因此最终会在字典中存储每个排名的最后一个值,这就是为什么您只在每个排名中看到更高价值的卡片。

如果它还没有任何内容,这是正确的做法。但是你需要检查它是否有任何东西,如果有的话,再添加一张已经存在的卡片。

首先,你想检查一下:我的手里面有东西吗? 在python中,我们可以使用if x in y:来检查,如果我们已经拥有该等级中的某些内容,那么这将是真的。如果是这样,我们希望append()新卡,它只是将其添加到我们已经拥有的列表中。 else我们只是添加了新卡片,但这里也略有变化:[card]说取卡并将其放入列表中。该列表是我们append()上的内容。

完整的改变:

if card.rank() in dictionary:
    dictionary[card.rank()].append(card)
else:
    dictionary[card.rank()] = [card]

答案 1 :(得分:0)

你明白你在这里写的是什么吗?让我们逐行浏览

> xpath -e "//text()[contains(., 'Chocolate') and not(contains(., 'Dark'))]" test.xml 
Chocolate
你知道dict是对的吗?对于每个不同的键,它存储一个值,当它获得相同键的新值时,它将替换它。这就是您获得def build_rank_D(H): dictionary = {} # every time you call a func a dict is created for i in range(0,len(H)): # traversing the H.. card = H[i] # you are trying to fetch the element at ith index dictionary[card.rank()] = card # you have key with it return dictionary # you are returning it back 而不是"{2: 2h, 3: 3s, 7: 7s}"

的原因

现在我们知道问题是什么,所以我们将讨论解决方案.. 我现在在这里给你一些提示.. 1)检查密钥是否已存在于dict中 2)如果密钥存在,则添加到该相同密钥的值 3)如果你没找到密钥,那么插入元素