我试图生成一副卡片,打印出7个值的列表,然后我想将列表按顺序排列。我是一个基本的python编码器,并通过python为我买的初学者书。
import random
for x in range(7):
rank = random.choice( ('A','2','3','4','5','6','7','8','9','T','J','Q','K') )
suit = random.choice( ('c','d','h','s') )
card = rank + suit
print(card)
我怎么能把列表整理好或者我完全错了
答案 0 :(得分:1)
import random
#create an empty list
y = list()
# continue picking cards until you have 7 cards -> avoid duplicates
while len(y) < 7:
rank = random.choice(('A','2','3','4','5','6','7','8','9','T','J','Q','K'))
suit = random.choice( ('c','d','h','s') )
card = rank + suit
#if the card is not present in the list, add it
if not card in y:
y.append(card)
#sort your list (by 1st letter -> no sort criteria were given)
y = sorted(y)
print(y)
答案 1 :(得分:0)
使用itertools.product
生成完整的牌组。它基本上为第一个iterable的每个元素提供了第二个iterable的每个元素的序列。然后你可以使用random.shuffle
来改变牌组,就像你真正的牌组一样。
然后获取前7个元素的一部分并对它们进行排序。
要进行排序,您需要提供key
功能,因为自然排序顺序不是您想要的。我们可以提供一个tuple
作为关键函数的返回值,它可以作为第一个字符相同时的平局。我们想要排序的是输入tuple
中的特定字符的索引(rank
,suit
)。
第一个排序键只使用tuple.index
方法获取tuples
中特定字符的索引。这很简单,但速度很慢,因为它必须每次都计算tuple
(O(n)或线性时间复杂度)。这些索引永远不会改变,因此我们可以将它们预先计算为dict
并在关键函数中查找恒定时间,这样会更快。对于像这样的应用程序,其中元组很小并且计算量很小,增益可能不那么显着,因此任何一种解决方案都可能是可接受的。
我排名第一,然后才适合。你的问题没有指明任何一种方式,但也许你可以根据自己的需要对它们进行排序?在这种情况下,您应该发现转换关键功能是一项有用的练习。
这是代码
from itertools import product
from random import choice, shuffle
rank = ('A','2','3','4','5','6','7','8','9','T','J','Q','K')
suit = ('c','d','h','s')
# make the full deck in the format of a 2 char string
deck = [r+s for r,s in product(rank, suit)]
# inplace shuffle of card
shuffle(deck)
# take the first 7 (we know there will be that many)
hand = deck[:7]
print(hand)
# sorting
# first way, slow but simpler
keyfn = lambda c: (rank.index(c[0]), suit.index(c[1]))
sortedhand = sorted(hand, key=keyfn)
print(sortedhand)
# second way, faster but more complex
def mkkeyfn():
rankmap = {v: i for i, v in enumerate(rank)}
suitmap = {v: i for i, v in enumerate(suit)}
def keyfn(val):
rank, suit = val
return rankmap[rank], suitmap[suit]
return keyfn
sortedhand2 = sorted(hand, key=mkkeyfn())
print(sortedhand2)