我的函数应该包含像[9,9,6,6,2]这样的列表,列表总是从最大到最小。 它应该返回两对,在列表中9和6是列表中出现的2对。
所以我的函数似乎工作但它只返回(9,)元组,它应该也包括6因为6也是一对(在列表中出现两次) 正确的回报是(9,6)
似乎for s in ...循环没有触及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
答案 0 :(得分:4)
您的算法完全不正确,只能找到第一对,但如果list_of_same
的集合与ranks
的第一个元素相同,则仅。 这不是给定的,因为集合没有设置顺序。
在您的情况下,9
是第一个列出的,因此rank[0] == 9
为真,rank[1] == 9
也是如此。但是,您只需将iter1
增加1,因此您测试的 next 值(6
或2
永远不会在{{1}找到因为发现它已经等于rank[1]
。
您可以通过对9
测试的集合(list_of_same = sorted(set(ranks), reverse=True)
)和iter1 = iter1 + 1
进行排序来解决这些问题。
您也永远不会测试是否只找到两个对;在这种情况下你应该返回if
但是你的函数将总是返回一个元组,无论输入是什么。
这里有一种更简单的方法。如果您的输入列表总是只包含5个元素(一个扑克牌),那么如果有两个对,那么None
总是长度为3(因为必须是非配对卡在手中);如果没有,只需返回set
。
要查找对,请查看前一张卡;如果它们是相同的,它就是一对;你的清单毕竟是排序的:
None
如果您不反对使用标准库,那么使用itertools.groupby()
将是另一种对卡片进行分组(已经排序)的好方法,只需测试它们的长度即可过滤掉对。如果您没有找到两对,则返回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)
:
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 None
技巧可以有效地计算迭代中元素的数量。
这两种方法都利用sum(1 for _ in group)
从最高到最低排序以反向排序顺序返回ranks
这一事实。
答案 1 :(得分:4)
这是因为只有在条件评估为真时才增加iter1
。
你应该取消iter1 = iter1 + 1
语句,以便即使当前迭代不是第一对也总会发生。
答案 2 :(得分:1)
我不能给你一个比其他人更好的答案,但我可以缩短你的代码:
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 newlist
count
方法计算值在列表中显示的次数。如果它出现两次,我将它附加到newlist
并将该列表作为元组返回。