我正在寻找一种方法来合并3个升序排序列表,而不使用任何内置函数或递归。 例如:
merge([1,4],[1,5,6],[3,7,9]) produces [1,1,3,4,5,6,7,9]
到目前为止,我已经完成了以下操作,但是并没有产生预期的上述结果。
def merge(list1, list2, list3):
results = []
while len(list1) and len(list2) and len(list3):
if (list1[0] < list2[0]) and (list1[0] < list3[0]):
results.append(list1.pop(0))
elif (list2[0] < list1[0]) and (list2[0] < list3[0]):
results.append(list2.pop(0))
elif (list3[0] < list1[0]) and (list3[0] < list2[0]):
results.append(list3.pop(0))
results.extend(list1)
results.extend(list2)
results.extend(list3)
return results
答案 0 :(得分:1)
您使用<
而不是<=
会给您带来麻烦。如果您有相同的数据点,则很容易导致if
语句的 none 触发。具体来说,从每个列表1/1/3
中获取第一个数据点,并在三个if
语句的条件下使用它们:
(1 < 1) and (1 < 3): no, fails first part
(1 < 1) and (1 < 3): no, fails first part
(3 < 1) and (3 < 1): no, fails both parts
由于未采取任何措施来修改列表,因此会导致无限循环。
无论如何,我认为当您只能将其作为两个双向合并来完成时,就会使三向合并使事情变得过于复杂:
def merge2(list1, list2):
result = []
idx1 = 0
idx2 = 0
# Get lowest while both lists are active.
while idx1 < len(list1) and idx2 < len(list2):
if list1[idx1] <= list2[idx2]:
result.append(list1[idx1])
idx1 += 1
else:
result.append(list2[idx2])
idx2 += 1
# Get remainder of each list (only one will be active here).
while idx1 < len(list1):
result.append(list1[idx1])
idx1 += 1
while idx2 < len(list2):
result.append(list2[idx2])
idx2 += 1
return result
def merge(list1, list2, list3):
# Three-way is two two-ways.
return merge2(merge2(list1, list2), list3)
print(merge([1,4],[1,5,6],[3,7,9]))
这效率比三通效率低,但除非使用真正的 large 数据集(我认为这样做)这样可以使程序更“干净”。
当然,聪明的方法是使用语言的实际功能。即使您已经声明您不想这样做(而且我不确定为什么会这样,除了可能是对类作业的人为限制之外),Pythonic方式还是:
def merge(list1, list2, list3):
allitems = [item for sublist in [list1, list2, list3] for item in sublist]
allitems.sort()
return allitems
实际上,您可以通过在调用中提供列表列表而不是固定数量的列表来使其处理任意数量的列表:
def merge(listOfLists):
allitems = [item for sublist in listOfLists for item in sublist]
allitems.sort()
return allitems
print(merge([[1,4],[1,5,6],[3,7,9]])) # Three lists, but any number will work.
答案 1 :(得分:-1)
或使用非内置排序方式:
def merge(*l):
l=[x for i in l for x in i]
newl = []
while l:
mi = l[0]
for x in l:
if x < mi:
mi = x
newl.append(mi)
l.remove(mi)
return newl
现在:
print(merge([1,4],[1,5,6],[3,7,9]))
是:
[1, 1, 3, 4, 5, 6, 7, 9]
答案 2 :(得分:-1)
没有任何内置功能,因此:
一种非常简单的形式:
def merge(*lists_in):
list_in = []
for l in lists_in:
list_in += l
i = 0
while True:
if i == list_in.__len__() -1:
break
if list_in[i] > list_in[i+1]:
temp = list_in[i]
list_in[i] = list_in[i+1]
list_in[i+1] = temp
i = 0
else:
i += 1
return list_in
对其进行测试:
list1 = [1,4]
list2 = [1,5,6]
list3 = [3,7,9]
print(merge(list1, list2, list3))
退出:
[1, 1, 3, 4, 5, 6, 7, 9]