Python 为什么我的代码在这个简单的练习中失败了?
我正在做一个编码练习: 给定一个整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增序列 示例Python 为什么我的代码在这个简单的练习中失败了?,python,arrays,Python,Arrays,我正在做一个编码练习: 给定一个整数序列作为数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增序列 示例 对于sequence=[1,3,2,1],输出应该是 虚假的 这个数组中没有一个元素可以被移除,以获得严格递增的序列 对于sequence=[1,3,2],输出应该是 是的 您可以从数组中删除3以获得严格递增的序列[1,2]。或者,您可以删除2以获得严格递增的序列[1,3] 所以我写了这段代码: def almostIncreasingSequence(sequence):
- 对于sequence=[1,3,2,1],输出应该是 虚假的 这个数组中没有一个元素可以被移除,以获得严格递增的序列
- 对于sequence=[1,3,2],输出应该是 是的 您可以从数组中删除3以获得严格递增的序列[1,2]。或者,您可以删除2以获得严格递增的序列[1,3]
def almostIncreasingSequence(sequence):
first_list, second_list = [x for x in sequence], [x for x in sequence]
for i in range(len(sequence)-1):
if sequence[i] >= sequence[i+1]:
first_list.remove(sequence[i])
second_list.remove(sequence[i+1])
break
if first_list == sorted(set(first_list)) or second_list == sorted(set(second_list)):
return True
else:
return False
代码通过了13/15次测试
下面是我的代码失败的两个输入:
[1, 2, 3, 4, 3, 6]
[3, 5, 67, 98, 3]
两个输入都应该返回True,但我的代码返回False。有什么想法吗?拿下你的第一张清单,
[1,2,3,4,3,6]
。在第一个列表
和第二个列表
上运行for循环后,这些变量的值为:
In [9]: first_list
Out[9]: [1, 2, 3, 3, 6]
In [10]: second_list
Out[10]: [1, 2, 4, 3, 6]
if
的第一部分为False
,因为:
In [12]: sorted(set(first_list))
Out[12]: [1, 2, 3, 6]
通过将列表放入一组,您已经失去了其中一个3
if
的第二部分为False
,因为第二个列表未排序
因此,if
语句的两个部分都是False
,函数返回False
阅读:
从列表中删除值为x的第一项。如果没有此类项目,则为错误
使用pop(index)
,而不是remove(value)
:
序列的类型是什么?它是一个列表吗?是的,它是一个列表。那么它的意义是什么:first\u list,second\u list=[x代表x的顺序],[x代表x的顺序]
?复制列表的python方法是first\u list=sequence[:]
@cezar制作两个列表副本的目的是以后能够比较它们。好的,在for循环之后,第一个列表就像你说的,[1,2,3,3,6]。但是,第二个列表应该是:[1,2,3,4,6],对吗?因为我们正在移除索引4(i+1)处的元素。在这种情况下,它等于sorted(set([1,2,3,4,6])函数应该返回True。或者我遗漏了什么?哦,没关系,Tomasz的答案解释了为什么我错了,而你是对的。完整的答案是这个答案和@Tomasz的组合。非常感谢,我在这个练习中坚持了至少几个小时,你的解释绝对完美。
>>> l = [1, 2, 3, 4, 3, 6]
>>> l.remove(3)
>>> print(l)
[1, 2, 4, 3, 6]
first_list.pop(i)
second_list.pop(i+1)