Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从一手7张牌中提取对_Python_Algorithm_Time Complexity - Fatal编程技术网

Python 从一手7张牌中提取对

Python 从一手7张牌中提取对,python,algorithm,time-complexity,Python,Algorithm,Time Complexity,我正在用Python编写代码来创建一个GoFish游戏,在这个游戏中,您需要的不是一种类型的四个,而是成对的。我用python编写了一段代码,在一张7张卡片的手里找到成对的卡片。代码给出了所有对的列表(因此它是列表的列表)。由于我是Python新手,我想知道是否有更有效的方法来实现我的代码 这是我写的代码。最终,它将成为类中的一个函数 #hand = ['D2', 'S1', 'D3', 'H1', 'C1', 'H5', 'D5'] #hand = ['D1', 'S1', 'S2', 'H2

我正在用Python编写代码来创建一个GoFish游戏,在这个游戏中,您需要的不是一种类型的四个,而是成对的。我用python编写了一段代码,在一张7张卡片的手里找到成对的卡片。代码给出了所有对的列表(因此它是列表的列表)。由于我是Python新手,我想知道是否有更有效的方法来实现我的代码

这是我写的代码。最终,它将成为类中的一个函数

#hand = ['D2', 'S1', 'D3', 'H1', 'C1', 'H5', 'D5']
#hand = ['D1', 'S1', 'S2', 'H2', 'C1', 'H5', 'D5']
#hand = ['D1', 'S1', 'S2', 'H1', 'C1', 'H5', 'D5']
hand = ['D1', 'S1', 'C1', 'H1', 'C2', 'H2', 'D5']
#hand = ['D2', 'S1', 'C3', 'H4', 'C5', 'H6', 'D7']

list_of_pairs = []
i=0
while i < len(hand):
    current_pos = i
    for k in range(i+1, len(hand)):
        card_1 = hand[i]
        card_2 = hand[k]
        if card_1[-1:] == card_2[-1:]:
            pair_2 = hand.pop(k)
            pair_1 = hand.pop(i)
            pair = [pair_1, pair_2] 
            list_of_pairs.append(pair)
            i = current_pos - 1
            break
    i +=1 

print(f"List of pairs is {list_of_pairs}")
print(f"Left over hand is {hand}")
#hand=['D2',S1',D3',H1',C1',H5',D5']
#hand=['D1',S1',S2',H2',C1',H5',D5']
#hand=['D1','S1','S2','H1','C1','H5','D5']
hand=['D1','S1','C1','H1','C2','H2','D5']
#hand=['D2','S1','C3','H4','C5','H6','D7']
_对的列表=[]
i=0
而我(手):
当前位置=i
对于范围内的k(i+1,len(hand)):
卡_1=手[i]
卡片2=手[k]
如果卡_1[-1::==卡_2[-1::]:
pair_2=手动弹出(k)
pair_1=手部弹出(i)
配对=[配对1,配对2]
列出\u对。追加(对)
i=当前位置-1
打破
i+=1
打印(f“成对列表为{成对列表}”)
打印(f“剩余手是{hand}”)
如果可以使用两对相同的卡

from collections import Counter
hand = [1,1,1,1,2,2,3,3,4,4,5,5,6,7,8,9,9,9,9]
card_counter = Counter()
for card in hand:
    card_counter[card]+=1

pairs = []
for k in card_counter:
    for i in range(int(card_counter[k]/2)):
        pairs.append([k,k])


也许在codereview.stackexchange上更好。com@Mateen我认为OP不希望他的代码被审查,而是希望他/她的暴力尝试有一个更有效的算法方法。Stackoverflow(algorithm tag)看起来非常适合这种情况。关于算法:对于大量n张卡,通过对卡进行排序并获得O(nlogn)复杂度,您将获得收益。这里n=7,您只有21对候选项。因此,蛮力方法似乎很有竞争力。如果要使用
计数器
,只需编写
card\u Counter=Counter(hand)
,而不使用循环。编写一个循环自己进行计数,这在一定程度上挫败了使用
计数器的目的。
from collections import Counter
hand = [1,1,1,1,2,2,3,3,4,4,5,5,6,7,8,9,9,9,9]
card_counter = Counter()
for card in hand:
    card_counter[card]+=1

pairs = []
for k in card_counter:
    for i in range(int(card_counter[k]/2)):
        pairs.append([k,k])