Python:在列表中查找相邻的重复项

qlvxas9a  于 2022-12-21  发布在  Python
关注(0)|答案(2)|浏览(213)

首先...我是Python新手...所以我道歉,如果这可能是你在这里见过的最基本的问题。基本上,我想解决Kaggle Python(初学者)课程中的一个问题,以解决以下挑战:

def menu_is_boring(meals):

    """Given a list of meals served over some period of time, return True if the
    same meal has ever been served two days in a row, and False otherwise.
    """

我创建了下面的嵌套for循环,目的是用这种方法比较列表和它自身,一旦发现重复,它就返回true:

for i in range(len(meals)):
        for j in range(i+1, len(meals)):
            if j == i:
                return True
    return False

输入为:meals=['垃圾邮件','鸡蛋','垃圾邮件','垃圾邮件','培根','垃圾邮件']
所以我会期待一个“True”(连续两次垃圾邮件),但是我的函数返回一个False。它看起来很简单...但是显然我遗漏了一些东西。也许我在这里遗漏了一些关于嵌套循环的基本东西。我在谷歌上搜索了其他嵌套循环用于复制的问题...但是看不到与我所做的有明显的区别。

42fyovps

42fyovps1#

一个更简单的解决方案是只使用一个循环,并使用i + 1作为第二个索引,但请注意,您必须缩短循环的长度,否则您将在最后一个循环周期中越界。

for i in range(len(meals) - 1):
    if meals[i] == meals[i + 1]:
        return True
# iff no same meals at two days the loop doesnt return True
# and after loop is finished execute next code, which is return False
return False
rdrgkggo

rdrgkggo2#

另一种处理方法是使用zip()函数将原始列表与原始列表的偏移量为1的位置绑定,并将这些值作为if a == b进行比较。
例如:

def test(items: list):
    return any(a==b for a, b in zip(items, items[1:]))

这将构建一个布尔值的生成器表达式。any()函数将"短路",并在找到True值后立即返回;从而使该功能非常有效。
输出:

>>> meals = ['Spam', 'Eggs', 'Spam', 'Spam', 'Bacon', 'Spam']
>>> test(meals)

True

相关问题