我正在尝试将混合整数的排序列表合并为#-#, #-#, #, #, #-#, etc.
格式的字符串列表
我当前完成了部分工作,但是while循环在完成合并整个列表之前结束。我不知道为什么会这样。在下面的代码中,我缩短了整数列表,因为正在使用的整数列表太长,无法粘贴到此处。
sorted_int_list = [1,2,3, 50,51, 66, 450,451,452, ...]
i = 0
current = None
anchor = None
first = True
consolidated = []
while i < len(sorted_int_list):
if current is None:
current = sorted_int_list[i]
if first:
anchor = current
else:
anchor = current - 1
elif sorted_int_list[i] == current + 1:
current = sorted_int_list[i]
else:
consolidated.append(str(anchor - 1) + '-' + str(sorted_int_list[i-1]))
current = None
first = False
i += 1
所需的输出是以下格式的完整列表:
1-3, 50-51, 66, 450-452, ...
您可以在这里查看我的实际输入/输出:https://pastebin.com/NTFzk7Dd
如您所见,它停在13663-13881,但输入列表转到15178
答案 0 :(得分:2)
在Python中,您可以使用元素的索引遍历列表而无需。
以下代码假定:该列表为非空。可以对其进行修改以处理这种情况。
sorted_int_list=[1,2,3,5,6,7,8,10,11]
start=sorted_int_list[0]
end=start
output=[]
for a in sorted_int_list[1:]:
if a==end+1:
end=a
else:
output.append((start,end))
start=a
end=a
output.append((start,end))
consolidated=[str(s)+'-'+str(e) for (s,e) in output]
这将consolidated
的值设为:
['1-3', '5-8', '10-11']
答案 1 :(得分:1)
使用笔和纸执行算法。这是你的算法 编辑之前:
sorted_int_list = [1,2,3, 50,51, 66, 450,451,452]
i = 0
current = None
anchor = None
consolidated = []
while i < len(sorted_int_list):
if current is None:
current = sorted_int_list[i]
anchor = current
elif sorted_int_list[i] == current + 1:
current = sorted_int_list[i]
else:
consolidated.append(str(anchor - 1) + '-' + str(sorted_int_list[i-1]))
current = None
anchor = None
i += 1
首先,您有这五行设置了变量
sorted_int_list = [1,2,3, 50,51, 66, 450,451,452]
i = 0
current = None
anchor = None
consolidated = []
然后
while i < len(sorted_int_list):
由于我小于len(sorted_int_list) = 9
,因此我们输入
环。然后
if current is None:
自current = None
起,我们输入if:
current = sorted_int_list[i]
anchor = current
在这两个语句之后,我们的变量具有以下值:
sorted_int_list = [1,2,3, 50,51, 66, 450,451,452]
i = 0
current = sorted_int_list[i] = 1
anchor = 1
然后我们退出if块并执行:
i += 1
现在i = 1
。我仍然不到9,所以我们重新运行了循环。但现在
current = 1
,因此if current is None:
不会触发。相反:
elif sorted_int_list[i] == current + 1:
将触发,因为sorted_int_list[i] = 2
等于`current +
1´。因此,我们输入了代码段:
current = sorted_int_list[i]
执行后,current
等于2。然后
i += 1
现在i = 2
。我们再次运行循环以完成操作,如果您这样做,
在纸上,您会看到变量变为:
anchor = 1
current = 3
i = 3
然后我们再做一次,现在出现了有趣的部分:
if current is None:
不会触发,因为current = 3
。
elif sorted_int_list[i] == current + 1:
因为sorted_int_list[i] = sorted_int_list[3]
= 50
而不是current + 1 = 4
不会触发。显然50 != 4
,因此我们输入
else:
。其中的第一句话是:
consolidated.append(str(anchor - 1) + '-' + str(sorted_int_list[i-1]))
再次在您的脑海中运行,就可以像这样简化它:
consolidated.append(str(anchor - 1) + '-' + str(sorted_int_list[i-1]))
consolidated.append(str(1 - 1) + '-' + str(sorted_int_list[3-1]))
consolidated.append('0' + '-' + str(sorted_int_list[2]))
consolidated.append('0' + '-' + str(3))
consolidated.append('0' + '-' + '3')
consolidated.append('0-3')
这是您的第一个错误。它应该附加1-3
而不是0-3
,对吗?能够
你发现错误了吗?继续执行:
current = None
anchor = None
这很好,那些变量现在已重置。然后:
i += 1
还可以。现在所有变量都是
current = None
anchor = None
i = 4
consolidated = ['0-3']
sorted_int_list = [1,2,3, 50,51, 66, 450,451,452]
循环再次运行,并且自current = None
起,我们执行:
current = sorted_int_list[i] = sorted_int_list[4] = 51
anchor = current = 51
使用多个等号表示以节省一些垂直空间 变量值变成什么。在这里您可能会看到一些东西 腥吗?为什么循环没捡到50?继续
i += 1 = 5
,我们再次循环。现在
sorted_int_list[i] = sorted_int_list[5] = 66
current + 1 = 51 + 1 = 52
52!= 66,所以我们进入循环的else:
:
consolidated.append(str(anchor - 1) + '-' + str(sorted_int_list[i-1]))
consolidated.append(str(51 - 1) + '-' + str(sorted_int_list[5-1]))
consolidated.append(str(50) + '-' + str(sorted_int_list[4]))
consolidated.append(str(50) + '-' + str(51))
consolidated.append('50-51')
这看起来不错,但这是真的吗?如果
列表以[1,2,3,40,51,...
而不是[1,2,3,50,51,...
开头?
继续
i += 1 = 6
,我们再次循环。现在current = None
,所以if的第一个分支
被采取:
current = sorted_int_list[i] = sorted_int_list[6] = 450
anchor = current = 450
这不是很好。为什么算法没有选择值66?它 似乎您的代码“忘记了”一些数字。怎么会来?
提示:在if语句的else:
子句中添加一些内容
添加在while循环完成后运行的内容。可能有
要添加到consolidated
列表中的额外项目。