我在kaggle上写了代码。
"给定一段时间内提供的饭菜清单,如果连续两天提供同一餐,则返回true,否则为虚假。"
def menu_is_boring(meals):
return any([ meals[l] == meals[l+1] for l in range(0,len(meals)-2) ])
给定 meals=['Spam', 'Spam']
的true的预期返回值,但得到了错误。
在您的示例中, len(meals)
是2,所以 len(meals)-2
是 0
,因此范围为空。
您只需要减去1。
尝试以下操作:
def menu_is_boring(meals):
return any([meals[l] == meals[l + 1] for l in range(0, len(meals) - 1)])
print(menu_is_boring(["Spam", "Spam"]))
输出:
true
值得注意的是,Python的range
不包括stop
参数(即list(range(1,5))
是[1, 2, 3, 4]
(
当您要在一个范围内比较两个连续值时,您可以使用 zip
创建对并在对上进行迭代并进行比较:
any(i == j for i, j in zip(meals, meals[1:]))
在这里我使用了发电机表达式,但是如果需要,您可以免费使用列表理解。
另一个选项是使用itertools.tee
创建两个迭代器,从第二个迭代器中消耗第一个元素,然后通过对迭代:
def menu_is_boring(meals):
it_1, it_2 = itertools.tee(meals)
next(it_2)
return any(i == j for i, j in zip(it_1, it_2))
这将比第一个要慢。
所以:
In [1104]: def menu_is_boring(meals):
...: return any(i == j for i, j in zip(meals, meals[1:]))
...:
In [1105]: meals=['Spam', 'Spam']
In [1106]: menu_is_boring(meals)
Out[1106]: True
In [1107]: def menu_is_boring(meals):
...: it_1, it_2 = itertools.tee(meals)
...: next(it_2)
...: return any(i == j for i, j in zip(it_1, it_2))
...:
In [1108]: menu_is_boring(meals)
Out[1108]: True
def menu_is_boring(meals):
counter=0
for i in range(0, len(meals) - 1):
if meals[i]==meals[i+1]:
counter=counter+1
if counter!=0:
return True
else:
return False
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 i in range(len(meals)):
for j in range(len(meals)-(i+1)):
#print(meals[i])
#print(meals[j+(i+1)])
if meals[i] == meals[j+(i+1)]:
return True
return False
meals= ["water","pear","apple","egg", "orange","apple"]
menu_is_boring(meals)