def is_correct_sequence(seq):
    """
    Check whether the given sequence does not contain
    the same value (except for None) more than once,
    and whether it only contains (1) integer values between 1
    and the length of the given sequence and/or (2) the special value None.
    """

    for i in range(len(seq)):
        if seq[i] < 1 or seq[i] > len(seq):
           return False
        elif type(seq[i]) != type(None) or type(seq[i]) != int:
            return False
        else:
            for i in range(len(seq)-1):
               for j in range(i+1, len(seq)):
                  if seq[i] == seq[j] != None:
                     return False
                  else:
                     return True

##TESTS

assert not is_correct_sequence((4, "abc", None, -17, None, "xyz"))
assert not is_correct_sequence((1, 2, 1))
assert not is_correct_sequence((1.0, None, 1))
assert is_correct_sequence((None, None, 4, 1))
assert is_correct_sequence((None, 1, 2, 3))

我对最后两个断言有问题,所以目标不是删除双打,而是查看顺序是否正确。 如果序列中的两个元素相同,则序列是不正确的,除了“无”(可能无数次出现)之外。 如何在我的代码中阐明这一点?

===============>>#1 票数:0

您的代码有一些问题。

一个主要问题是,您实际上从未检查过每个元素一次-当您的代码命中“ return”语句时,它会立即返回,而不检查其他所有语句。 当您需要返回False时,这是False ,因为如果任何时候都为False ,则无需检查序列的其余部分。

但是,当您返回True时,这一个问题,因为您还没有排除以后该子序列可能不正确的情况。

另一个问题是if语句中的条件微不足道-尝试仔细查看并找出它们的实际作用。 考虑到这些因素,您的代码的正确版本将是:

def is_correct_sequence(seq):
    for i in range(len(seq)):
        if seq[i] is not None and (seq[i] <= 1 and seq[i] >= len(seq)):
            # This check previously failed if seq[i] was None, and did not
            # check the bounds properly
            return False
        elif seq[i] is not None and type(seq[i]) != int:
            # Use 'and', not 'or'
            return False
        else:
            for i in range(len(seq)-1):
                for j in range(i+1, len(seq)):
                    if seq[i] == seq[j] and seq[i] is not None and seq[j] is not None:
                        # Again, same thing. This failed if either seq[i] or seq[j]
                        # were not equal to None
                        return False
    return True

如代码中所述,您的主要问题不是检查项目是否等于“无”。 如果是这样,将其与数字进行比较时会得到奇怪的结果。

顺便说一句,要检查的正确方法如果一个元素是None或不None在Python是成语item is Noneitem is not None

但是,更简洁的代码编写方式可能是:

def is_correct_sequence(seq):
    nums = [a for a in seq if a is not None]
    allowed_types = (type(None), int)

    contains_correct_types = all(isinstance(a, allowed_types) for a in seq)
    numbers_within_bounds = all(1 <= a <= len(seq) for a in nums)
    numbers_are_unique = len(nums) == len(set(nums))
    # Set returns a version of a list with all duplicates removed

    return contains_correct_types and numbers_within_bounds and numbers_are_unique

而不是使用一个for循环中,我们可以使用列表内涵和发电机内涵以及内建的anyall的功能更清楚地表达你的代码的意图。

===============>>#2 票数:0

尝试通过以下方法,看是否有意义。 我仅使用您提供的断言对其进行了测试,并且似乎可以使用。

def is_correct_sequence(seq):
    return has_unique_values(seq) and has_correct_range(seq)

def has_unique_values(seq):
    """
    Check whether sequence contains the same value (excluding None) more than once

    Returns True if all values are unique or None, False otherwise.
    """

    nones = seq.count(None)
    seq_set = set(seq)

    if nones:
        if len(seq) != (len(seq_set) + nones - 1):
            return False
    else:
        if len(seq) != len(seq_set):
            return False

    return True

def has_correct_range(seq):
    """
    Check whether sequence contains integer values between 1 and the length
    of the given sequence and/or the special value None.
    """

    accepted_range = range(1, len(seq) + 1)
    for e in seq:
        if e not in accepted_range and e is not None:
            return False

    return True

assert not is_correct_sequence((4, "abc", None, -17, None, "xyz"))
assert not is_correct_sequence((1, 2, 1))
assert not is_correct_sequence((1.0, None, 1))
assert is_correct_sequence((None, None, 4, 1))
assert is_correct_sequence((None, 1, 2, 3))

===============>>#3 票数:0

这是一个通过所有断言的紧凑版本:

from collections import Counter

def is_correct_sequence(seq):

    len_seq = len(seq)
    counts = Counter(seq)

    for value, count in counts.items():

        # Never check None items
        if (value is not None and (

            # Does the value occur more than once
            # or has it a bad type (no integer)?
            (count > 1 or not isinstance(value, int)) or

            # Or is the integer not in the valid range?
            (value < 1 or value > len_seq))
            ):

            # Sequence is in correct!
            return False

    return True


assert not is_correct_sequence((4, "abc", None, -17, None, "xyz"))
assert not is_correct_sequence((1, 2, 1))
assert not is_correct_sequence((1.0, None, 1))
assert is_correct_sequence((None, None, 4, 1))
assert is_correct_sequence((None, 1, 2, 3))

你应该用

  • isinstance()用于类型检查
  • is None / is not None而不是== None / != None
  • 对于这样的简单测试,没有嵌套循环( collections.Counter应该使我的解决方案相当有效)

  ask by user3542600 translate from so

未解决问题?本站智能推荐:

1回复

具有重复但不加倍的列表的所有排列

我见过类似但不同的东西: 这里 。 我绝对想要所有列表元素的排列而不是组合。 我的是不同的,因为itertools排列的a,b,c返回abc,而不返回aba(soooo close)。 我怎样才能得到像aba这样的结果呢? 哦,排列的最大长度(在python.org itertoo
1回复

在barplot python中将标签加倍

我处理航班延误的数据集。 该数据集位于: https : //www.transtats.bts.gov/DL_SelectFields.asp?Table_ID=236&DB_Short_Name= On- Time 事实是,当我想绘制每月延迟天数汇总的条形图时,我的标签在x轴
3回复

Python:将函数中的变量加倍

当我运行此代码时,它会使需要中断的行数加倍,因此输出: \n\n 如何使其打印正确数量的换行符?
1回复

简单的斐波那契序列无法在Python中提供正确答案

这是一个非常简单的脚本,但是当您使用任何数字调用该函数时,结果都是错误的。 fib(10)=13。这是错误的。
2回复

Python战舰,麻烦加倍

为什么它会问你两次要把战舰放在哪里? 我不知道该怎么做。 无论如何,在此链接中您都可以看到完整的代码,因为我不知道这是否必要。 http://speedy.sh/QYJWp/battleship-goed.txt 我认为问题发生在//_______________________
2回复

在嵌入式python中加倍

因此,我正在编写一组运行Python脚本的C ++类。 我已经获得了可以在指定目录中运行所需脚本的代码,并且可以很好地传递和返回值。 但是我遇到的一个问题是我似乎找不到如何设置Python的两倍。 例如,当我使用长值时,我可以使用“ PyLong_AsLong([无论我试图从PyObj
3回复

如果Python for循环中的条件加倍

我正在做一个python 练习 ,要求: 这是我当前的代码: 我看了一下,我认为它应该可以工作,但是它未能通过某些测试,这对我来说表明我对Python逻辑的工作方式并不了解。 关于为什么我的解决方案不起作用的任何解释都很好。 这些都是测试结果:
3回复

强制将Python计算加倍[重复]

这个问题已经在这里有了答案: 如何强制除法为浮点数? 除数一直舍入到0? 11个答案 为什么该部门在Python中不起作用? [重复] 4个答案 Python Division 12答案 我想在Python中打印一个双。 但这不起作用,我
1回复

Python:将随机生成器加倍

我尝试创建一个生成器,该生成器将查找1到m范围内的n个随机整数。 下面的代码正是这样做的,但是有时会返回以前打印的数字的两倍。 有人知道我该如何编辑吗? 另一件事是,但从设计角度来看,更明智的是,如何订购打印件,以便数字顺序正确?
1回复

使用python将图像加倍[关闭]

我必须使用python将图像加倍 所以我认为我可以将图像的每个像素替换为由4个像素组成的正方形 我该怎么做,并为小方块的每个像素分配不同的颜色?