【问题标题】:Compare and Merge two lists in python在python中比较和合并两个列表
【发布时间】:2021-08-17 14:48:32
【问题描述】:

我有两个列表。我想合并这两个列表。

list_1 = ['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i']
list_2 = ['a', 'b', 'd', 'e', 'f', 'h', 'i']

我想要的输出是

['a', 'b', 'c', 'd', 'e','f', 'g', 'h', 'i']

我尝试了以下算法

missing_elem = []
missing_index = []
elem_to_add = []

for i, elem in enumerate(list_2):
    if elem not in list_1:
        missing_elem.append(elem)
        missing_index.append(i)

print(missing_index)
print(missing_elem)

for i in range(len(missing_index)):
    elem_to_add.append(missing_elem[i])
    list_1.insert(missing_index[i], col_to_add)
    elem_to_add = []
    
print(list_1)

上面的输出是

[3]
['e']
['a', 'b', 'c', ['e'], 'd', 'f', 'g', 'h', 'i']

因为 e 在 list_2 中的 'd' 和 'f' 之间,但在输出中我得到它在 'c' 和 'd' 之间 请帮助我获得正确的输出

【问题讨论】:

  • 算法的目的是什么?
  • 我不明白。对不起。您现有的尝试在整个输出集上循环,并且描述中没有关于相邻元素的任何内容。也许添加输入来说明为什么sorted(set(list_1) | set(list_2)) 不起作用 工作。
  • 那么只需对输出进行排序...?
  • 根据什么逻辑定义“正确的索引”?为什么“斑马”要介于“猫”和“狗”之间?我强烈建议您编辑您的帖子以显示 2-3 个附加示例来说明您的规范。我建议使用不按字母顺序排列的元素列表来更好地激发我建议的解决方案不合适的原因。我要敲了,因为我迷路了,可能只是在这一点上惹你生气。
  • 这是有道理的,但是a = [1, 5, 3, 15, 2]b = [6, 1, 10] 呢?什么是正确的输出?我们知道我们需要在a 中插入 6,但查看相邻元素并没有告诉我们什么。您说列表未排序。 a = [1, 6, 22, 4]b = [7, 2] 怎么样?

标签: python list merge


【解决方案1】:

这是一个可能的解决方案,基于您的努力:

list_1 = ['a', 'c', 'b', 'b2', 'd', 'f', '1g', 'h', 'i']
list_2 = ['e4', 'z', 'a', 'c', 'd', 'code', 'e', 'e2', 'f', 'h', 'i', 'j']

print(list_1)

# Locate the missing elements in list_1 and their left neighbors
missing_elem_and_neighbor = []
for ind, elem in enumerate(list_2):
    if elem not in list_1:
        if ind > 0:
            missing_elem_and_neighbor.append((elem, list_2[ind-1]))
        else:
            missing_elem_and_neighbor.append((elem, None))

# Insert missing elements into list_1
for elem, nei in missing_elem_and_neighbor:
    if nei:
        ind_nei = list_1.index(nei)
        list_1.insert(ind_nei+1, elem)
    else:
        if list_1[0] in list_2:
            # Goes before 0 in list_1
            list_1.insert(0, elem)
        else:
            # Assumption - right after the first in list_1
            list_1.insert(1, elem)

print(list_1)

我让测试用例更具代表性——它没有按字母顺序以避免混淆,它有连续的缺失值,而且它也以缺失值开头。

此代码不是查找缺失值,而是查找它们的左邻居。然后根据list_1中左邻居的位置插入缺失值,保持顺序。

如果缺失值出现在list_1 的第一个元素之前,它们将按照它们在list_2 中出现的顺序插入到list_1 的开头。如果list_1 中的第一个元素在list_2 中完全缺失,那么list_2 值最终会从list_1 中的索引1 插入(与list_1 = ['e4', 'z', 'c', 'd', 'code', 'e', 'e2', 'f', 'h', 'i', 'j'] 核对)。

为了避免ValueError在连续丢失元素的情况下,将丢失的元素直接插入list_1,从左到右(这也可以用单独的列表来完成,当然,重点是从左到右- 正确的插入顺序,以便邻居始终存在于合并列表中)。

【讨论】:

    【解决方案2】:

    听起来你想要的规则是:

    1. 将第一个列表中的元素添加到最终列表中(如果它尚不存在)
    2. 将第二个列表中的元素添加到最终列表中(如果它尚不存在)

    如果是这样,算法就很简单了

    list_1 = ['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i']
    list_2 = ['a', 'b', 'd', 'e', 'f', 'h', 'i']
    
    longest_list_len = max(len(list_1), len(list_2))
    final_list = []
    for i in range(longest_list_len):
        if i < len(list_1):
            elem_1 = list_1[i]
            if elem_1 not in final_list:
                final_list.append(elem_1)
        if i < len(list_2):
            elem_2 = list_2[i]
            if elem_2 not in final_list:
                final_list.append(elem_2)
    print(final_list)
    > ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
    

    【讨论】:

    • 这假设只有 1 个连续的缺失元素。 [1, 2, 3, 4], [6, 7, 8] => [1, 6, 2, 7, 3, 8, 4]?你确定这是正确的结果吗? [0, 1, 2, 10, 11], [5, 10, 11, 2, 1, 6] => [0, 5, 1, 10, 2, 11, 6]?
    【解决方案3】:

    这正是您在示例代码中尝试做的事情,但我不知道它是否符合您最终想要做的事情:

    list_1 = ['a', 'b', 'c', 'd', 'f', 'g', 'h', 'i']
    list_2 = ['a', 'b', 'd', 'e', 'f', 'h', 'i']
    
    
    for i in range(len(list_2)):
        if list_2[i] not in list_1:
            list_1.insert(i + 1 , list_2[i])
    
    print(list_1)
    >>>['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i']
    

    其他人所问的究竟是什么意思是“应该”去的价值观只有对人们才有意义。我们知道“e”介于“d”和“f”之间,但计算机(当然不包括)

    有很多方法可以告诉计算机列表应该是什么。 你可以有一个主列表:

    masterlist = ['a', 'b', 'c', '1', 'e', 'f', 'g', 'h', 'i']
    

    然后将您的列表与您的主列表进行比较。

    【讨论】:

    • 这也假设有 1 个缺失元素。您可以跟踪您在列表中的位置,但最终这不是 OP 想要做的(我不认为)。
    【解决方案4】:

    您可以使用集合来获取所有唯一条目,然后按字母顺序对其进行排序。

    combined = sorted(list(set(list1 + list2)))
    

    【讨论】:

    • .sort() 就地并返回None,这就是combined 的最终结果。你想要sorted()。而且,无论如何,我认为这不是 OP 真正想要的(尽管我不清楚他们想要什么)。
    • 我不同意@ggorlen。看来 OP 想要的是它的输出列表的两件事:没有冗余和排序。无需重复:无需重新发明轮子,套装非常适合。并且使用 python 的内置排序功能也很简单。没有额外的库,一行,显式:pythonic.
    • @Osamoele 如果您查看编辑,这篇文章最初使用了combined = stuff.sort(),即always wrong because combined will always be None。然后编辑此答案以解决该问题,因此我的评论部分已过时。
    • @Osamoele 也就是说,OP 还没有创建一个可行的规范。所有答案都是对 OP 意图的随机猜测。如果您认为此解决方案适用于您遇到或想象 OP 遇到的某些问题,那很好,但它不能回答 OP 的基本问题,即使它恰好在他们选择不当的测试用例上产生了正确的输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多