【发布时间】:2017-01-16 09:22:24
【问题描述】:
我在 python 中有一个整数列表,我希望输出是序列中不同“陨石坑”的列表。我将陨石坑定义为一系列数字,这些数字以递减的整数开始,逐渐变大,直到它们达到等于陨石坑的第一个整数或大于陨石坑的第一个整数的数字。 如果最后一个数字等于或小于第一个数字 - 它应该在火山口末端的输出中。如果最后一个数字大于火山口中的第一个数字 - 它不应附加到输出列表的末尾。
例如,对于列表: 1,2,3,4,5,6,5,4,3,4,5,6,7,8,9 “陨石坑”将是: 6,5,4,3,4,5,6
我的代码:
def find_crater(my_list):
cur_crater = []
for i in range(len(my_list)-1):
#check if the numbers are decreasing
if (my_list[i] - my_list[i+1] > 0):
cur_crater.append(my_list[i])
#if increasing - check if we're in a crater
#and if current number is smaller than begining of crater
elif len(cur_crater) > 1 and my_list[i] <= cur_crater[0]:
cur_crater.append(my_list[i])
#print crater and empty list
elif len(cur_crater) > 1 and my_list[i+1] > cur_crater[0]:
print(cur_crater)
cur_crater = []
#continue if we're out of a crater
else:
continue
#catching the last crater in the list
if len(cur_crater) > 1:
#include last int
if my_list[i] - my_list[-1] < 0 and my_list[-1] <= cur_crater[0]:
cur_crater.append(my_list[-1])
print(cur_crater)
return
我已经在 2 个列表上调用了该函数。第一个输出符合预期:
ok_list = [12, 4, 7, 4, 2, 4, 5, 6, 5, 12, 21, 23,
24, 26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14,
17, 27, 28, 19, 17, 19, 21, 19, 12, 23, 25, 27]
好的列表输出[编辑:不太好-它省略了第一个'4'所以结果不是那么好]:
[12, 7, 4, 2, 4, 5, 6, 5, 12]
[26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14, 17]
[28, 19, 17, 19, 21, 19, 12, 23, 25, 27]
但是,第二个列表在输出中将 2 个陨石坑列表合并为 1 个列表:
problematic = [12, 4, 7, 4, 2, 4, 5, 6, 5, 12, 21, 23,
24, 26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14,
17, 27, 19, 25, 19, 12, 23, 25, 27]
有问题的输出:
[12, 7, 4, 2, 4, 5, 6, 5, 12]
[26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14, 17, 27, 19, 25, 19, 12, 23, 25]
我期待:
[12, 4, 7, 4, 2, 4, 5, 6, 5, 12]
[26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14, 17]
[27, 19, 25, 19, 12, 23, 25, 27]
我试图通过以下方式解决这个问题: my_list[i+1] > cur_crater[0] 并因此检查列表中下一个 int 的大小 - 但这似乎并不能解决它[我将它留在代码中,即使它没有起到作用,希望有人解释为什么错误/不起作用?]。
总之,当火山口后面有一个火山口,中间只有一个 int 时,我的代码无法处理它。
如果输入是:
[12, 4, 7, 4, 2, 4, 5, 6, 5, 12, 21, 10, 9, 8, 6, 9, 10]
然后输出是一个长列表,但我想在列表项 12 之后和列表项 21 之前拆分它,但输出是一个长列表。
我很想获得有关任何库或方法的信息,这些信息可以为我提供更多关于更好和更有效解决方案的想法。
【问题讨论】:
-
为什么你可以接受第二个列表输出
[26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14, 17],按照你的预期,它应该停在28,即等于或大于第一个int? -
我的意思是如果它相等/更小 - 它属于解决方案。我会重写我的问题。我想这还不清楚,我的错
-
你以前用过 numpy - 如果你可以创建算法的矢量化形式,它应该会更快
-
为什么前4个不见了,它从12下降> 4然后上升到7?
-
试试
[12, 4, 7, 4, 2, 4, 5, 6, 5, 12, 21, 23, 24, 26, 25, 22, 10, 9, 8, 6, 9, 10, 11, 13, 12, 14, 17, 27, 19, 25, 19, 12, 23, 25, 27, 12,3,4],根据您的规范,27 应该添加到倒数第二个列表中,并在之后创建一个新列表