Python 这些多if语句可以压缩吗?
我制作了一个简单的程序,根据看到的卡片告诉用户哪些卡片仍然在卡片组中。如果你看一下代码,你会发现有几个If语句可以做几乎相同的事情。谁能帮我把这些浓缩一下吗Python 这些多if语句可以压缩吗?,python,Python,我制作了一个简单的程序,根据看到的卡片告诉用户哪些卡片仍然在卡片组中。如果你看一下代码,你会发现有几个If语句可以做几乎相同的事情。谁能帮我把这些浓缩一下吗 对于卡中的卡,请参见: 如果card.endswith('C')==True: 牌组[“梅花”]。移除(牌) 如果card.endswith('D')==True: 牌组[“钻石”]。移除(牌) 如果card.endswith('H')==True: 牌组[“红心”]。移除(牌) 如果card.endswith('S')==True: 牌组
对于卡中的卡,请参见:
如果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
是一种更通用的方法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:仅1remove
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中,以避免密钥错误取决于生成卡的方式和位置。如果您正在创建卡片,则不需要,如果用户提供输入,则需要进行消毒。