循环使用连续元素

时间:2015-10-29 03:14:45

标签: python

我是Python编程的初学者,我在使用某些列表时遇到了一些麻烦。

所以我想编写一个返回布尔值的函数。该功能将通知用户他或她输入的列表中是否存在重复的连续元素对。顺便说一句,我想只使用len()range()loopsif-statements,变量和算术(没有内置函数)来执行此操作。

例如:

contains_consecutive_duplicates([1,3,3]) should return True

contains_consecutive_duplicates([3,2,3]) should return False

我的代码:

def contains_consecutive_duplicates(xs):
     for i in xs:
         if xs[i] == xs[i-1] or xs[i] == xs[i+1]:
             return True
         else:
             return False

我的逻辑如下:每次for循环运行时,i将引用列表中的某个元素。如果该元素是在它之前或之后的元素等于它,那么for循环将返回true。如果没有,继续搜索。如果没有,则返回false。

现在,我实际上了解错误的位置(我认为)。问题是我不知道如何解决它。我认为for循环在开始时遇到问题(当i正在响应第0个元素时)。第0个元素之前没有元素,因此错误:

"index out of range"

P.S:你是如何返回一个布尔值的?

有更好的方法吗?

我将不胜感激任何帮助!提前谢谢!

5 个答案:

答案 0 :(得分:2)

@roeland指出了假设直接迭代list会得到索引(如果你想要索引和值,使用enumerate)的问题。但在这种情况下,你实际上并不需要索引。

对于简单的情况(已知它是一个可以切片的容器),你可以在偏移切片上用zip进行迭代:

def contains_consecutive_duplicates(xs):
     return any(x == y for x, y in zip(xs, xs[1:]))

可以使用itertools.groupby进行更一般的解决方案来处理您无法切片的情况,但这很简单且无需导入。

在这种情况下使用any只是简单地扼杀生成器表达式并返回True如果任何值是真实的。长期等效形式是:

def contains_consecutive_duplicates(xs):
    for x1, x2 in zip(xs, xs[1:]):
        if x1 == x2:
            return True
    return False

由于你的老师显然认为内置插件很糟糕,但lenrange不是内置插件(他们是),你可以用愚蠢的方式做到这一点:

def contains_consecutive_duplicates(xs):
    for i in range(len(xs) - 1):
        if xs[i] == xs[i+1]:
            return True
    return False

zip相同的工作,效率较低(生成索引整数和显式索引在Python中相对于本机迭代而言是惊人的昂贵)。

答案 1 :(得分:1)

试试这个:

def contains_consecutive_duplicates(xs):
    for i in xs:
        if xs.indexOf(i)==len(xs):
            break
        if xs[i] == xs[i-1] or xs[i] == xs[i+1]:
            return True
        else:
            return False

您正在尝试做的是评估xs[i+1],但这不存在。

答案 2 :(得分:1)

仅使用rangeforif语句,可以通过以下方式完成:

def contains_consequtive_duplicates(xs):
    for i in range(len(xs)-1):
        if xs[i] == xs[i+1]: return True
    return False

您可以使用index而不是(使用for i in list)来访问列表。此外,如果您执行检查xs[i] == xs[i-1],则不会产生您想要的结果,因为x[-1]将检查列表的结尾,因此[3, 2, 3]将返回True。

作为一个小型演示:

if contains_consequtive_duplicates([1,3,3]): print "consecutive"
# Prints Consequtive

if contains_consequtive_duplicates([3, 2, 3]): print "consecutive"
# Prints nothing

答案 3 :(得分:1)

这应该做:

>>> def contains_consecutive_duplicates(xs):
...   for i, v in enumerate(xs[:-1]):
...     if v == xs[i+1]:
...       return True
...     else:
...       pass
...   return False
>>> l1 = [1,3,3]
>>> l2 = [1,3,2]
>>> l3 = []
>>> l4 = [2]
>>> contains_consecutive_duplicates(l1)
True
>>> contains_consecutive_duplicates(l2)
False
>>> contains_consecutive_duplicates(l3)
False
>>> contains_consecutive_duplicates(l4)
False
>>>

答案 4 :(得分:-1)

这应该可以解决问题:

def contains_consecutive_duplicates(xs):
    for i in range(1, len(xs) - 1):
        if xs[i] == xs[i-1] or xs[i] == xs[i+1]:
            return True
    return False

迭代遍历所有值的第一个和最后一个(由范围函数创建),如果找到重复,则返回(结束循环)。 如果它到达结尾并且没有找到重复的那个必须不存在,那么它将返回False