如果我们假设您的两个列表都是有序的,并且它们各自仅缺少一些元素,则我可以看到一个算法,应该在大多数情况下都有效。
1. 取A中的下一个索引。
2. 遍历B查找匹配项:
- 如果有匹配项:
- 从B的开头到匹配项(含匹配项)的所有内容删除,并添加到C。
- 如果没有匹配项:
- 将A的索引添加到C。
3. 重复执行步骤2。
4. 如果B中还有任何剩余项,请将其添加到C中。
以下是该算法的Python代码:
a1 = ['Second', 'Third', 'Fourth']
b1 = ['First', 'Second', 'Third']
a2 = ['First', 'Third', 'Fourth']
b2 = ['First', 'Second', 'Third']
a3 = ['First', 'Third', 'Fourth']
b3 = ['First', 'Second', 'Fourth']
def merge(a, b):
c = []
b_oldindex = 0
for a_index in range(len(a)):
match = False
for b_index in range(b_oldindex, len(b)):
if a[a_index] == b[b_index]:
c.extend(b[b_oldindex:b_index+1])
b_oldindex = b_index + 1
match = True
break
if not match:
c.append(a[a_index])
if b_oldindex < len(b):
c.extend(b[b_oldindex:])
return c
print(merge(a1,b1))
print(merge(a2,b2))
print(merge(a3,b3))
print(merge(b1,a1))
print(merge(b2,a2))
print(merge(b3,a3))
这将产生以下输出:
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Third', 'Second', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
['First', 'Second', 'Third', 'Fourth']
在所有测试用例中,唯一无法产生正确顺序的是
merge(a3,b3)
。
要完全解决这个问题可能需要实现一个正确的
合并算法(如在
归并排序中使用的算法),这需要能够评估元素应该处于的顺序。您可以在Rosetta code上看到一个
python实现的合并排序。
更新:
考虑到这实际上是对一组书籍的分期付款进行排序,您可以通过考虑其他信息来避免您在第三组数据中描述的情况。即,按版权或出版日期的
相反顺序对列表使用
merge
函数。
例如,在您的情况下:
a3 = ['First', 'Third', 'Fourth']
b3 = ['First', 'Second', 'Fourth']
a3
的书应该在
b3
的书之前出版。如果你能收集到这种元数据,那么你就可以避免这个问题。
同一本书的不同版本在版权日期上不会有区别,但在出版日期上可能会有区别。因此,在查看出版日期之前,请先查看版权日期。
['First', 'Second', 'Fourth']
和['First', 'Third', 'Fourth']
这样的情况怎么办?如果没有其他正确顺序的信息,程序无法确定'Second'
或'Third'
哪个先出现。 - jpmc26