【发布时间】:2012-12-23 20:39:00
【问题描述】:
我有两个列表,比如说:
keys1 = ['A', 'B', 'C', 'D', 'E', 'H', 'I']
keys2 = ['A', 'B', 'E', 'F', 'G', 'H', 'J', 'K']
如何创建一个没有重复的合并列表,保留两个列表的顺序,在它们所属的位置插入缺失的元素?像这样:
merged = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K']
请注意,元素可以根据相等性进行比较,但不是有序的(它们是复杂的字符串)。 元素不能通过比较来排序,但它们有一个基于它们在原始列表中出现的顺序。
如果出现矛盾(两个输入列表中的顺序不同),任何包含所有元素的输出都是有效的。当然,如果解决方案在保留大部分订单方面显示出“常识”,则可以加分。
再一次(正如一些 cmets 仍在争论的那样),列表通常不会在公共元素的顺序方面相互矛盾。如果他们这样做了,算法需要优雅地处理该错误。
我从一个版本开始,它使用 .next() 迭代列表以仅推进包含不匹配元素的列表,但 .next() 只是不知道何时停止。
merged = []
L = iter(keys1)
H = iter(keys2)
l = L.next()
h = H.next()
for i in range(max(len(keys1, keys2))):
if l == h:
if l not in merged:
merged.append(l)
l = L.next()
h = H.next()
elif l not in keys2:
if l not in merged:
merged.append(l)
l = L.next()
elif h not in keys1:
if h not in merged:
merged.append(h)
h = H.next()
else: # just in case the input is badly ordered
if l not in merged:
merged.append(l)
l = L.next()
if h not in merged:
merged.append(h)
h = H.next()
print merged
这显然不起作用,因为 .next() 会导致最短列表异常。现在我可以更新我的代码以在每次调用 .next() 时捕获该异常。但是代码已经很不符合pythonic了,这显然会破灭泡沫。
有没有人更好地了解如何遍历这些列表以组合元素?
如果我可以一次完成三个列表,则可以获得奖励积分。
【问题讨论】:
-
我不认为您要计算的列表通常可以保证存在。如果
keys1 = ['A', 'B', 'D']; keys2 = ['D', 'C', 'B']怎么办? -
算法应该如何解决这种情况:
keys1 = ['A', '%', '*']和keys1 = ['A', '@', '?'] -
@RyanThompson 有解决方案,即['A', 'B', 'D', 'C', 'B'] 和['A', 'D', 'C', 'B', 'D'],但是如何选择返回哪一个呢?一个元素是否允许在输出序列中重复?
-
我想这就是重点。该问题给出了一个示例,其中通过间距和按顺序使用字母字符使所需答案变得明显,但随后说元素是无序的。因此,给出的示例并没有完全说明在一般情况下所需的结果。
-
再想一想,我想知道 OP 是否没有有效地寻求最短常见超字符串问题的解决方案?