我正在嘗試創建一副紙牌,將其洗牌,然后重新排序。
問題是當我在洗牌后對它進行排序時,串列最終會變成這樣:[10, 11, 12, 13, 8, 9]
例如,我使用了一個較小的甲板。用一副完整的牌,串列仍然是:[10, 11, 12, 13, 1, 2, ...]
為什么串列沒有正確排序?
這是我的代碼:
import random
# Initialize Deck
deck = []
suits = ['Club', 'Spade', 'Heart', 'Diamond']
for i in range(8, 14):
for s in range(4):
deck.append([str(i), suits[s]])
# Format numbers into card face
for i in range(len(deck)):
if deck[i][0] == "1":
deck[i][0] = "Ace"
elif deck[i][0] == "11":
deck[i][0] = "J"
elif deck[i][0] == "12":
deck[i][0] = "Q"
elif deck[i][0] == "13":
deck[i][0] = "K"
print("Initial deck", deck)
print()
# Shuffle Deck
random.shuffle(deck)
print("Shuffle function:", deck)
# Turn face back to number for sorting
for i in range(len(deck)):
if deck[i][0] == "Ace":
deck[i][0] = "1"
elif deck[i][0] == "J":
deck[i][0] = "11"
elif deck[i][0] == "Q":
deck[i][0] = "12"
elif deck[i][0] == "K":
deck[i][0] = "13"
deck.sort()
print("Sort function: ", deck)
輸出:
Initial deck: [['8', 'Club'], ['8', 'Spade'], ['8', 'Heart'], ['8', 'Diamond'], ['9', 'Club'], ['9', 'Spade'], ['9', 'Heart'], ['9', 'Diamond'], ['10', 'Club'], ['10', 'Spade'], ['10', 'Heart'], ['10', 'Diamond'], ['J', 'Club'], ['J', 'Spade'], ['J', 'Heart'], ['J', 'Diamond'], ['Q', 'Club'], ['Q', 'Spade'], ['Q', 'Heart'], ['Q', 'Diamond'], ['K', 'Club'], ['K', 'Spade'], ['K', 'Heart'], ['K', 'Diamond']]
Shuffle function: [['J', 'Heart'], ['8', 'Club'], ['Q', 'Spade'], ['9', 'Diamond'], ['9', 'Heart'], ['10', 'Diamond'], ['K', 'Heart'], ['K', 'Spade'], ['10', 'Heart'], ['9', 'Club'], ['8', 'Heart'], ['K', 'Club'], ['8', 'Diamond'], ['Q', 'Diamond'], ['9', 'Spade'], ['Q', 'Heart'], ['10', 'Spade'], ['K', 'Diamond'], ['J', 'Diamond'], ['Q', 'Club'], ['10', 'Club'], ['8', 'Spade'], ['J', 'Spade'], ['J', 'Club']]
Sort function: [['10', 'Club'], ['10', 'Diamond'], ['10', 'Heart'], ['10', 'Spade'], ['11', 'Club'], ['11', 'Diamond'], ['11', 'Heart'], ['11', 'Spade'], ['12', 'Club'], ['12', 'Diamond'], ['12', 'Heart'], ['12', 'Spade'], ['13', 'Club'], ['13', 'Diamond'], ['13', 'Heart'], ['13', 'Spade'], ['8', 'Club'], ['8', 'Diamond'], ['8', 'Heart'], ['8', 'Spade'], ['9', 'Club'], ['9', 'Diamond'], ['9', 'Heart'], ['9', 'Spade']]
uj5u.com熱心網友回復:
這是因為串列中的值是串列,而這些串列包含字串。嘗試這樣的事情:
import random
# Initialize Deck
deck = []
suits = ['Club', 'Spade', 'Heart', 'Diamond']
for i in range(8, 14):
for s in range(4):
deck.append([i, suits[s]])
# Format numbers into card face
for i in range(len(deck)):
if deck[i][0] == 1:
deck[i][0] = "Ace"
elif deck[i][0] == 11:
deck[i][0] = "J"
elif deck[i][0] == 12:
deck[i][0] = "Q"
elif deck[i][0] == 13:
deck[i][0] = "K"
print("Initial deck", deck)
print()
# Shuffle Deck
random.shuffle(deck)
print("Shuffle function:", deck)
# Turn face back to number for sorting
for i in deck:
if deck[i][0] == "Ace":
deck[i][0] = 1
elif deck[i][0] == "J":
deck[i][0] = 11
elif deck[i][0] == "Q":
deck[i][0] = 12
elif deck[i][0] == "K":
deck[i][0] = 13
deck.sort(key=lambda x:return x[0])
print("Sort function: ", deck)
uj5u.com熱心網友回復:
您希望排名是int值(而不是它們的str版本),以便可以比較它們以進行排序。來回翻轉它們進行列印/分類是很多不必要的作業;我建議使用一種__repr__方法定義一個物件類,該方法可以按照您想要的方式對其進行格式化。
import random
class Card:
def __init__(self, rank: int, suit: str):
self.rank = rank
self.suit = suit
def __repr__(self) -> str:
rank_names = {
1: "Ace",
11: "J",
12: "Q",
13: "K",
}
return f"[{rank_names.get(self.rank, self.rank)} {self.suit}]"
deck = [
Card(rank, suit)
for rank in range(8, 14)
for suit in ['Club', 'Spade', 'Heart', 'Diamond']
]
print("Initial deck", deck, "\n")
random.shuffle(deck)
print("Shuffled deck:", deck, "\n")
deck.sort(key=lambda card: (card.rank, card.suit))
print("Sorted deck:", deck)
印刷:
Initial deck [[8 Club], [8 Spade], [8 Heart], [8 Diamond], [9 Club], [9 Spade], [9 Heart], [9 Diamond], [10 Club], [10 Spade], [10 Heart], [10 Diamond], [J Club], [J Spade], [J Heart], [J Diamond], [Q Club], [Q Spade], [Q Heart], [Q Diamond], [K Club], [K Spade], [K Heart], [K Diamond]]
Shuffled deck: [[K Heart], [10 Club], [9 Diamond], [8 Diamond], [10 Spade], [J Spade], [K Spade], [J Heart], [9 Spade], [10 Heart], [K Club], [10 Diamond], [Q Club], [K Diamond], [Q Spade], [J Diamond], [Q Diamond], [J Club], [9 Club], [8 Club], [9 Heart], [8 Heart], [Q Heart], [8 Spade]]
Sorted deck: [[8 Club], [8 Diamond], [8 Heart], [8 Spade], [9 Club], [9 Diamond], [9 Heart], [9 Spade], [10 Club], [10 Diamond], [10 Heart], [10 Spade], [J Club], [J Diamond], [J Heart], [J Spade], [Q Club], [Q Diamond], [Q Heart], [Q Spade], [K Club], [K Diamond], [K Heart], [K Spade]]
uj5u.com熱心網友回復:
對于數值,您應該使用整數而不是字串。我還建議您用元組替換兩個元素的內部串列,例如(更多的是一種風格選擇):
[(8, 'Club'), (8, 'Spade'), ...]
如果您堅持使用字串,那么您可以key在 sort 函式中添加引數。它接受一個在比較之前映射您的物件的函式。在你的情況下:
deck.sort(key=lambda x: int(x[0]))
它獲取串列的每個元素并將該元素的第一個成員轉換為整數。
另一項建議是,使用字典而不是 if else 來映射數字和卡面,如下所示:
# Dictionary instead of if/elif/else
number_to_face = {
"1": "Ace",
"11": "J",
"12": "Q",
"13": "K"
}
這是一個帶有調整的完整示例。
import random
# Initialize Deck
deck = []
suits = ['Club', 'Spade', 'Heart', 'Diamond']
for i in range(8, 14):
for s in range(4):
deck.append((str(i), suits[s]))
# Dictionary instead of if/elif/else
number_to_face = {
"1": "Ace",
"11": "J",
"12": "Q",
"13": "K"
}
# Reverse mapping of key -> value to value -> key
face_to_number = {v: k for k, v in number_to_face.items()}
# Use list comprehension to update list
def map_with(deck, mapping):
return [(mapping.get(k, k), v) for k, v in deck]
# Format numbers into card face
deck = map_with(deck, number_to_face)
print("Initial deck", deck)
print()
# Shuffle Deck
random.shuffle(deck)
print("Shuffle function:", deck)
print()
# Turn face back to number for sorting
# Use list comprehension to update list
deck = map_with(deck, face_to_number)
deck.sort(key=lambda x: int(x[0]))
print("Sort function: ", deck)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/365976.html
