首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数未命中整个for循环。

函数未命中整个for循环。
EN

Stack Overflow用户
提问于 2015-01-13 18:29:34
回答 3查看 98关注 0票数 0

我的函数应该包含一个像9,9,6,6,2这样的列表,这个列表总是从最大到最少。它应该返回两对,在列表中,9和6是出现在列表中的2对。

因此,我的函数似乎在工作,但它只返回(9,)元组,并且它也应该包括6,因为6也是一对(在列表中出现两次),正确的返回是(9,6)

好像是因为.循环没有触及6,不知道如何修复它。

代码语言:javascript
复制
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
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-13 18:31:35

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

在您的例子中,9是第一个列出的,所以rank[0] == 9是真的,rank[1] == 9也是。但是您只将iter1增量为1,因此您测试的下一个值( 62 )永远不会在rank[1]中找到,因为它已经被发现等于9

您可以通过对集合(list_of_same = sorted(set(ranks), reverse=True))进行排序并在if测试之外使用iter1 = iter1 + 1来解决这些问题。

如果只找到两对,您也不会进行测试;在这种情况下,您应该返回None,但是不管输入是什么,函数总是返回一个元组。

这里有一种更简单的方法。如果您的输入列表总是包含5个元素(一只扑克手),那么如果有两对您的set总是长度为3(因为手上必须有一张非配对的卡片);如果没有,只需返回None

若要查找这两对,请查看前面的卡片;如果它们相同,则为一对;您的列表毕竟是排序的:

代码语言:javascript
复制
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

代码语言:javascript
复制
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从最高到最低排序的事实,以反向排序的方式返回pairs

票数 4
EN

Stack Overflow用户

发布于 2015-01-13 18:33:40

这是因为只有在条件计算为true时才会增加iter1

您应该取消iter1 = iter1 + 1语句的缩进,这样即使当前的迭代不是对的,也始终会发生这种情况。

票数 4
EN

Stack Overflow用户

发布于 2015-01-13 18:55:10

我不能给你一个比其他人更好的答案,但是我可以把你的代码缩短很多:

代码语言:javascript
复制
    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中,并以元组的形式返回该列表。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27929001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档