如何合并混合整数列表(#-#,#-#等)

时间:2019-04-16 00:59:11

标签: python python-3.x

我正在尝试将混合整数的排序列表合并为#-#, #-#, #, #, #-#, 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

2 个答案:

答案 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列表中的额外项目。