我是Python编程的初学者,我在使用某些列表时遇到了一些麻烦。
所以我想编写一个返回布尔值的函数。该功能将通知用户他或她输入的列表中是否存在重复的连续元素对。顺便说一句,我想只使用len()
,range()
,loops
,if-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:你是如何返回一个布尔值的?
有更好的方法吗?
我将不胜感激任何帮助!提前谢谢!
答案 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
由于你的老师显然认为内置插件很糟糕,但len
和range
不是内置插件(他们是),你可以用愚蠢的方式做到这一点:
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)
仅使用range
,for
和if
语句,可以通过以下方式完成:
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
。