Python 这些多if语句可以压缩吗?

Python 这些多if语句可以压缩吗?,python,Python,我制作了一个简单的程序,根据看到的卡片告诉用户哪些卡片仍然在卡片组中。如果你看一下代码,你会发现有几个If语句可以做几乎相同的事情。谁能帮我把这些浓缩一下吗 对于卡中的卡,请参见: 如果card.endswith('C')==True: 牌组[“梅花”]。移除(牌) 如果card.endswith('D')==True: 牌组[“钻石”]。移除(牌) 如果card.endswith('H')==True: 牌组[“红心”]。移除(牌) 如果card.endswith('S')==True: 牌组

我制作了一个简单的程序,根据看到的卡片告诉用户哪些卡片仍然在卡片组中。如果你看一下代码,你会发现有几个If语句可以做几乎相同的事情。谁能帮我把这些浓缩一下吗

对于卡中的卡,请参见:
如果card.endswith('C')==True:
牌组[“梅花”]。移除(牌)
如果card.endswith('D')==True:
牌组[“钻石”]。移除(牌)
如果card.endswith('H')==True:
牌组[“红心”]。移除(牌)
如果card.endswith('S')==True:
牌组[“黑桃”]。移除(牌)

您可以使用字典简化代码:

card\u套装={
‘C’:‘俱乐部’,
D:“钻石”,
‘H’:‘红心’,
“S”:“黑桃”
}
对于卡片中的卡片,请参见:
西服=卡片西服[卡片[-1]]
牌组[套装]。移除(牌)
一些评论:

  • 了解布尔表达式。您不需要包括
    ==True
  • 阅读有关切片的文章。您可以使用
    文本[-1]
    来获取最后一个字符,但是前面已经说过,
    .endswith
    是一种更通用的方法
  • 是的,有可能

    步骤1:删除与
    True
    的冗余比较:

    if card.endswith('C'):
        Deck["clubs"].remove(card)
    if card.endswith('D'):
        Deck["diamonds"].remove(card)
    if card.endswith('H'):
        Deck["hearts"].remove(card)
    if card.endswith('S'):
        Deck["spades"].remove(card)
    
    步骤2:仅1
    remove
    method调用

    for card in cards_seen:
        deck = None
        if card.endswith('C'):
            deck = Deck["clubs"]
        if card.endswith('D'):
            deck = Deck["diamonds"]
        if card.endswith('H'):
            deck = Deck["hearts"]
        if card.endswith('S'):
            deck = Deck["spades"]
        deck.remove(card)
    
    步骤3:使用字典进行数据组映射

    card_to_deck = { 'C':"clubs", 'D': "diamonds", 'H':"hearts", 'S':"spades"}
    for card in cards_seen:
        deckname = card_to_deck[card[-1]]
        Deck[deckname].remove(card)
    

    首先,您可以删除无用的
    ==true
    指令

    您可以创建这样的词典:

    card_map = { 'C': "clubs", 'D': "diamonds", 'H': "hearts", 'S': "spades" }
    
    for card in cards_seen:
        deck_to_update = [value for key, value in card_map.items() if card.endswith(key)][0]
        Deck[deck_to_update].remove(card)
    
    然后,您可以像这样简化源代码:

    card_map = { 'C': "clubs", 'D': "diamonds", 'H': "hearts", 'S': "spades" }
    
    for card in cards_seen:
        deck_to_update = [value for key, value in card_map.items() if card.endswith(key)][0]
        Deck[deck_to_update].remove(card)
    
    说明:

    • 首先,使用之前的相同指令提取要更新的组的名称
    • 然后更新牌组,移除所看到的牌

    似乎
    实例应该有
    套装
    属性。然后你可以使用类似于
    Deck[card.suit].remove(card)
    的东西。这对于这里来说太广泛和基于观点了,因为可能有很多不同的方法来实现这一点。请注意,
    ==True
    部分是不必要的,因为
    if
    已经在检查其真实性,所有条件都可以通过使用
    进行“连接”:
    if card.endswith('C')| | card.endswith('H')您可能需要测试密钥是否在dict中,以避免密钥错误取决于生成卡的方式和位置。如果您正在创建卡片,则不需要,如果用户提供输入,则需要进行消毒。