[英]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
是代表這三堆的列表; 有關這些堆的更多信息,請參見下文。
算法卡技巧如下:
魔術師將21張打亂的撲克牌正面朝上分成三堆,從左到右逐行工作。 魔術師第一次執行此操作時,要求觀眾選擇其中一張卡,並對其選擇保密。
魔術師要求聽眾說出他們的牌是在第一堆,第二堆還是第三堆中。
3.魔術師一堆一堆地收集卡片,確保將選定的堆放置在其他兩個堆之間。
將步驟1-3再重復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.