Python函数没有达到整个for循环

时间:2015-01-13 18:29:34

标签: python

我的函数应该包含像[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

3 个答案:

答案 0 :(得分:4)

您的算法完全不正确,只能找到第一对,但如果list_of_same的集合与ranks的第一个元素相同,则这不是给定的,因为集合没有设置顺序。

在您的情况下,9是第一个列出的,因此rank[0] == 9为真,rank[1] == 9也是如此。但是,您只需将iter1增加1,因此您测试的 next 值(62永远不会在{{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并将该列表作为元组返回。