我打算订购错误的清单

时间:2018-03-11 21:40:18

标签: python loops

我试图生成一副卡片,打印出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)

我怎么能把列表整理好或者我完全错了

2 个答案:

答案 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中的特定字符的索引(ranksuit)。

第一个排序键只使用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)