我的函数应该包含一个像9,9,6,6,2这样的列表,这个列表总是从最大到最少。它应该返回两对,在列表中,9和6是出现在列表中的2对。
因此,我的函数似乎在工作,但它只返回(9,)元组,并且它也应该包括6,因为6也是一对(在列表中出现两次),正确的返回是(9,6)
好像是因为.循环没有触及6,不知道如何修复它。
def two_pair(ranks):
"""If there are two pair, return the two ranks as a
tuple: (highest, lowest); otherwise return None."""
# Your code here.
iter1 = 0
listToTup = []
list_of_same = set(ranks)
for s in list_of_same:
if s == ranks[iter1] and s == ranks[iter1 + 1]:
listToTup.append(s)
iter1 = iter1 + 1
#alist = (listTuple.sort(reverse = True))
alist = (sorted(listToTup, reverse=True))
atup = tuple(alist)
return atup发布于 2015-01-13 18:31:35
您的算法完全不正确,只有在list_of_same集合与ranks的第一个元素相同的情况下,才能找到第一对。这不是给定的,因为集合没有设置顺序。
在您的例子中,9是第一个列出的,所以rank[0] == 9是真的,rank[1] == 9也是。但是您只将iter1增量为1,因此您测试的下一个值( 6或2 )永远不会在rank[1]中找到,因为它已经被发现等于9。
您可以通过对集合(list_of_same = sorted(set(ranks), reverse=True))进行排序并在if测试之外使用iter1 = iter1 + 1来解决这些问题。
如果只找到两对,您也不会进行测试;在这种情况下,您应该返回None,但是不管输入是什么,函数总是返回一个元组。
这里有一种更简单的方法。如果您的输入列表总是包含5个元素(一只扑克手),那么如果有两对您的set总是长度为3(因为手上必须有一张非配对的卡片);如果没有,只需返回None。
若要查找这两对,请查看前面的卡片;如果它们相同,则为一对;您的列表毕竟是排序的:
def two_pair(ranks):
"""If there are two pair, return the two ranks as a
tuple: (highest, lowest); otherwise return None."""
if len(set(ranks)) != 3:
return None
pairs = []
preceding = None
for card in ranks:
if card == preceding:
pairs.append(card)
preceding = card
return tuple(pairs)如果您不反对使用标准库,那么使用itertools.groupby()将是另一种很好的方法来分组您的卡片(已经排序),并简单地测试它们的长度,以过滤对。如果您没有找到两对,则返回None
from itertools import groupby
def two_pair(ranks):
"""If there are two pair, return the two ranks as a
tuple: (highest, lowest); otherwise return None."""
pairs = tuple(card for card, group in groupby(ranks)
if sum(1 for _ in group) == 2)
return pairs if len(pairs) == 2 else Nonesum(1 for _ in group)技巧尽可能有效地计算可迭代中的元素数。
这两种方法都利用ranks从最高到最低排序的事实,以反向排序的方式返回pairs。
发布于 2015-01-13 18:33:40
这是因为只有在条件计算为true时才会增加iter1。
您应该取消iter1 = iter1 + 1语句的缩进,这样即使当前的迭代不是对的,也始终会发生这种情况。
发布于 2015-01-13 18:55:10
我不能给你一个比其他人更好的答案,但是我可以把你的代码缩短很多:
def two_pair(ranks):
newlist = []
for i in set(ranks):
if ranks.count(i) == 2:
newlist.append(i)
newlist.sort(reverse = True)
newlist = tuple(newlist)
return None if newlist == () else newlistcount方法计算一个值出现在列表中的次数。如果它出现了两次,我会将其附加到一个newlist中,并以元组的形式返回该列表。
https://stackoverflow.com/questions/27929001
复制相似问题