簡體   English   中英

如何在特定條件下以特定順序將列表放入一個更大的列表中? -Python 3.x

[英]How to put lists into one larger list in a certain order for certain conditions? - Python 3.x

現在,我有一個代碼看起來類似於以下內容:

def get_newdeck(choice, P1, P2, P3):
    deck = []
    if choice == 1:
        deck = P2+P1+P3
        return deck
    elif choice == 2:
        deck = P1+P2+P3
        return deck
    else:
        deck = P1+P3+P2
        return deck

這是代碼的一部分,而該代碼也是魔術技巧的代碼的一部分,魔術技巧從21的“ deck”中猜測用戶的牌。 choice是為其輸入的用戶輸入(整數為1、2或3)該卡以前在其中, P1, P2, P3是代表這三堆的列表; 有關這些堆的更多信息,請參見下文。
算法卡技巧如下:

  1. 魔術師將21張打亂的撲克牌正面朝上分成三堆,從左到右逐行工作。 魔術師第一次執行此操作時,要求觀眾選擇其中一張卡,並對其選擇保密。

  2. 魔術師要求聽眾說出他們的牌是在第一堆,第二堆還是第三堆中。

3.魔術師一堆一堆地收集卡片,確保將選定的堆放置在其他兩個堆之間。

  1. 將步驟1-3再重復2次。

  2. 完成這些步驟后,所選卡片將“神奇地”位於21張卡片組的中間。

有問題的步驟是第三步,我正在嘗試使其看起來不太重復。

有沒有辦法讓我的代碼(如上所示)使用循環工作? 僅供參考,我正在使用Python-3.x

如果需要的話,這里是完整的代碼-我知道它很雜亂,沒有注釋,但是我正在嘗試從“混亂”部分開始進行修復。

import random

def get_cards():
    nums, suits=['Ace','2','3','4','5','6','7','8','9','10','Jack','Queen','King'], ['Hearts','Clubs','Diamonds','Spades']
    cards_dealt=[]
    while len(cards_dealt) < 22:
        card = random.choice(nums) + " of " + random.choice(suits)
        if card not in cards_dealt:
            cards_dealt.append(card)
        else:
            continue        
    return cards_dealt


def get_piles(deck):
    P1, P2, P3 = [], [], []
    for i in range(21):
        if i%3 == 0:
            P1.append(deck[i])
        elif i%3 == 1:
            P2.append(deck[i])
        else:
            P3.append(deck[i])
    return P1, P2, P3

#####################################
def get_newdeck(choice, P1, P2, P3):
    deck = []
    if choice == 1:
        deck = P2+P1+P3
        return deck
    elif choice == 2:
        deck = P1+P2+P3
        return deck
    else:
        deck = P1+P3+P2
        return deck
#####################################

def main():
    deck = get_cards()
    print("Choose a card and remember it")
    for x in range(3):
        P1, P2, P3 = get_piles(deck)
        piles = {'Pile 1':P1, 'Pile 2': P2, 'Pile 3':P3} 
        for numpile, pile in sorted(piles.items()):
            print()
            print(numpile,': ')
            for card in pile:
                print(card)
        print()
        choice = 0
        while choice > 3 or choice < 1:
            while True:
                try:
                    choice = int(input("Which pile is your card in? (1-3)? > "))
                    break
                except ValueError:
                    print("Must be a number")
        deck = get_newdeck(choice, P1, P2, P3)
    print()
    print('Your card is {}'.format(deck[10]))


main()

您可以執行以下操作:

def get_newdeck(choice, P1, P2, P3):
    chunks = [P1, P2, P3]
    idx = choice-1
    deck = chunks[(idx-1) % 3]+chunks[idx % 3]+chunks[(idx+1) % 3]
return deck

我采用idx=choice-1所以他們的選擇是0、1或2,這將與chunks列表中的三張紙牌很好地匹配。 現在, chunks[idx]是他們選擇的樁, chunks[idx-1]chunks[idx+1]分別是他們選擇的樁之前和之后的樁,因此可以通過將樁放置在其他兩個樁之間來創建deck % (模運算)只是確保如果我們超出0,1,2范圍,我們會將結果包裝回該范圍。

如果您對他們的選擇進行了想象,這很容易形象化。然后,樁就按照P1,P2,P3的順序排列。

如果用戶選擇第一個樁,則idx將為0,而在此之前的樁將為-1。 模數3變為2,這是序列中的最后一個堆。

首先,我不認為您的代碼在3種情況下看起來都是重復的。 但是為了交換想法,我的想法是:

由於您希望choice位置與中間元素交換,在本例中為索引1 (包含三個元素的列表,索引將為0, 1, 2 ),因此您可以執行

piles[choice - 1], piles[1] = piles[1], piles[choice - 1]

(當然,如果choice = 2 ,則什么都不會改變)

測試代碼:

def get_newdeck(choice, P1, P2, P3):
    piles = [P1, P2, P3]
    piles[choice - 1], piles[1] = piles[1], piles[choice - 1]
    deck = []
    for pile in piles:
        deck.extend(pile)
    return deck


if __name__ == "__main__":
    choice = 1
    P1 = [1, 2]
    P2 = [3, 4]
    P3 = [5, 6]
    deck = get_newdeck(choice, P1, P2, P3)
    print(deck)

我認為您的代碼沒有任何嚴重的問題。 對於包含3個元素的列表,如果您已經在做,而不是編寫不必要的混亂循環,那么可讀性就很高。

我在玩你的代碼,我只做了幾件事,主要是外觀:)

import random

def get_cards():
    nums, suits=['A','2','3','4','5','6','7','8','9','10','J','Q','K'], [u'\u2665',u'\u2663',u'\u2666',u'\u2660']
    cards_dealt=[]
    while len(cards_dealt) < 22:
        card = random.choice(nums) + random.choice(suits)
        if card not in cards_dealt:
            cards_dealt.append(card)
        else:
            continue        
    return cards_dealt


def get_piles(deck):
    P1 = [deck[i] for i in range(0,21,3)]
    P2 = [deck[i] for i in range(1,21,3)]
    P3 = [deck[i] for i in range(2,21,3)]
    return P1, P2, P3

#####################################
def get_newdeck(choice, P1, P2, P3):
    deck = P1+P3+P2
    if choice == 1:
        deck = P2+P1+P3
    elif choice == 2:
        deck = P1+P2+P3
    return deck
#####################################

def main():
    deck = get_cards()
    print("Choose a card and remember it")
    for x in range(3):
        P1, P2, P3 = get_piles(deck)
        piles = {'Pile 1':P1, 'Pile 2': P2, 'Pile 3':P3} 
        for numpile, pile in sorted(piles.items()):
            print(numpile+': ', end='\t')
            for card in pile:
                print(card, end='\t')
            print()
        print()
        choice = 0
        while choice > 3 or choice < 1:
            while True:
                try:
                    choice = int(input("Which pile is your card in? (1-3)? > "))
                    break
                except ValueError:
                    print("Must be a number")
        deck = get_newdeck(choice, P1, P2, P3)
    print()
    print('Your card is {}'.format(deck[10]))

main()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM