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

时间:2019-07-06 21:28:34

标签: python

我做了一个简单的程序,根据看到的纸牌告诉用户纸牌中还剩下哪些纸牌。如果看一下代码,您会发现有多个if语句可以做几乎相同的事情。有人可以帮我浓缩这些吗?

for card in cards_seen:
    if card.endswith('C') == True:
        Deck["clubs"].remove(card)
    if card.endswith('D') == True:
        Deck["diamonds"].remove(card)
    if card.endswith('H') == True:
        Deck["hearts"].remove(card)
    if card.endswith('S') == True:
        Deck["spades"].remove(card)

3 个答案:

答案 0 :(得分:6)

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

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

一些评论:

  1. 了解布尔表达式。您不需要包括== True
  2. 了解切片。您可以使用text[-1]来获取最后一个字符,但是,.endswith是更通用的方法。

答案 1 :(得分:1)

是的,有可能。

第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方法调用

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)

答案 2 :(得分:0)

首先,您可以删除无用的package main import ( "github.com/unidoc/unioffice/document" "io/ioutil" "log" "os" ) func main() { _, err := ioutil.ReadFile("filled-form.docx") if err == nil { err = os.Remove("filled-form.docx") if err != nil { log.Fatal(err) } } doc, err := document.Open("form.docx") if err != nil { log.Fatalf("error opening form: %s", err) } for _, f := range doc.FormFields() { if f.Type() == document.FormFieldType(1) { f.SetValue("test") } } for _, f := range doc.FormFields() { log.Println("-------------------") log.Println(f.Name()) log.Println(f.Value()) } err = doc.SaveToFile("filled-form.docx") if err != nil { log.Fatal(err) } } 指令。

您可以创建这样的字典:

== true

然后您可以像这样简化源代码:

card_map = { 'C': "clubs", 'D': "diamonds", 'H': "hearts", 'S': "spades" }

说明:

  • 首先,按照之前的相同说明提取要更新的牌组名称
  • 然后您更新卡片组,移除看到的卡片