【发布时间】:2016-11-07 17:42:19
【问题描述】:
如何在保留的同时合并 2 个任意未排序列表 a 和 b
两个列表的顺序?我不想丢弃重复项或排序。
空白的格式只是为了让人类读者可视化:
a = ['a', 'b', 'c', 'X', 'Y', '127' ]
b = ['a', 'b', 'X', '44', 'Y', 'w', '127', 'X' ]
期望的输出m:
m = ['a', 'b', 'c', 'X', '44', 'Y', 'w', '127', 'X' ]
我应该更简洁地指定合并顺序。
匹配优先级进入列表a:
尝试将列表 a 中的每个项目与 b 中的项目匹配
So if a = ['b', 'a', 'r', 'n']
and b = ['b', 'r', 'a', 'n'],
merged m = ['b', 'r', 'a', 'r', 'n']
字典解决方案删除重复项(b[2] 和 b[7] 都是 'X')。
这需要是程序化的;我正在查看数百万行数据。 difflib 很有趣,可能是为了另一个问题,但我认为它对这个问题没有帮助。
我在 Windows-7 上使用 Python 2.7.12
下面的代码解决了这个问题,但没有我想的那么干净和简单。
def merge_lists(a, b):
""" Merge 2 arbitrary unsorted lists a and b while preserving
the order from both lists. Do not discard duplicates or sort."""
ia = ib = 0
m = []
if len(a) == 0:
m = b
elif len(b) == 0:
m = a
while ia < len(a) and ib < len(b):
if a[ia] == b[ib]:
m.append(a[ia])
ia += 1
ib += 1
else:
count = b[ib:].count(a[ia])
if count == 0:
m.append(a[ia])
ia += 1
else:
k = b[ib:].index(a[ia])
for i in range(ib, k+ib):
m.append(b[i])
ib += k
if ia >= len(a):
for i in range(ib, len(b)):
m.append(b[i])
if ib >= len(b):
for i in range(ia, len(a)):
m.append(a[i])
return m #--- END --- merge_lists()
【问题讨论】:
-
欢迎来到Stack Overflow!您可能知道,SO 是一个问答网站。读者,比如你自己,提出问题,而其他读者试图回答这些问题。您的帖子缺少 SO 帖子的基本要素——问题!你的问题究竟是什么?
-
在
a和b的文字中插入空格的方式似乎未指定。请解释逻辑(这是编写代码的良好第一步。 -
您没有很好地定义新列表的顺序:例如,说
a=[1]和b=[2]结果应该是什么?[1,2]或[2,1]? -
当你的两个列表是
['b', 'a', 'r', 'n']和['b', 'r', 'a', 'n']时,你期望什么输出?