【问题标题】:Merge function will only work for ordered list合并功能仅适用于有序列表
【发布时间】:2017-09-14 11:43:54
【问题描述】:

我有这 2 个列表作为输入:

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]]
list2 = [['A', 14, 'Y', 0, 200], ['B', 15, 'M', 0, 400], ['C', 17, 'G', 0, 600]]

我想要的输出是这样的:

finalList = [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60],['C', 17, 'G', 0, 600]]

使用此功能:

def custom_merge(list1, list2):
    finalList = []
    for sub1, sub2 in zip(list1, list2):
        if sub1[1]==sub2[1]:
            out = sub1.copy()
            out[2] = sub2[2]
            out[4] = sub2[4]
            finalList.append(out)
        else:
            finalList.append(sub1)
            finalList.append(sub2)
    return finalList

我确实会得到我想要的输出,但是如果我切换位置(list2[1] 和 list2[2])和我的 list2:

list2 = [['A', 14, 'Y', 0, 200], ['C', 17, 'G', 0, 600], ['B', 15, 'M', 0, 400]]

那么输出会是这样的:

[['A', 14, 'Y', 10, 200], ['B', 15, 'S', 30, 40], ['C', 17, 'G', 0, 600], ['C', 16, 'F', 50, 60], ['B', 15, 'M', 0, 400]]

(注意额外的 ['B', 15, 'M', 0, 400])

如果我的列表在我的列表中有不同的顺序,我必须在我的函数中修改什么以获得我想要的第一个输出!?我用的是python 3。谢谢!

稍后编辑:

合并规则: 当list1[listindex][1] == list2[listindex][1](例如:当14==14)时,替换list1 -> list2[2]list2[4](例如:'Y' 和 200),如果不只是将list2 中的不匹配列表添加到@ 987654332@ 原样(就像我想要的输出一样)并保留 list1 中不匹配的那些(例如:['C', 16, 'F', 50, 60]

需要注意的是 list1 和 list2 可以有不同的 len(list1 可以有比 list2 更多的列表,反之亦然)

编辑.2 我发现了这个:

def combine(list1,list2):
    combined_list = list1 + list2
    final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list}
    merged_list = [list(k) + list (final_dict[k]) for k in final_dict]
    return merged_list 

^^ 可以,还在测试中!

【问题讨论】:

  • 不确定这里的合并逻辑是什么。
  • 在我的原帖中添加了合并规则。

标签: python python-3.x list


【解决方案1】:

您可以在合并之前按子列表中的第一个元素对列表进行排序。

def custom_merge(list1, list2):
    finalList = []
    for sub1, sub2 in zip(sorted(list1), sorted(list2)):
        if sub1[1]==sub2[1]:
            out = sub1.copy()
            out[2] = sub2[2]
            out[4] = sub2[4]
            finalList.append(out)
        else:
            finalList.append(sub1)
            finalList.append(sub2)
    return finalList

测试:

list1 = [['A', 14, 'I', 10, 20], ['B', 15, 'S', 30, 40], ['C', 16, 'F', 50, 60]]
list2 = [['A', 14, 'Y', 0, 200], ['C', 17, 'G', 0, 600], ['B', 15, 'M', 0, 400]]
custom_merge(list1, list2)
# returns:
[['A', 14, 'Y', 10, 200],
 ['B', 15, 'M', 30, 400],
 ['C', 16, 'F', 50, 60],
 ['C', 17, 'G', 0, 600]]

【讨论】:

  • 嗯,如果我向 list2 添加一个额外的列表:['S', 20, 'Y', 0, 200],我实际上不会在输出中看到它
  • @TatuBogdan:zip 将始终截断为缩短的可迭代对象。因此,如果您向它提供一个包含 3 个元素的列表和一个包含 10 个元素的列表,您将获得较长列表中的前 3 个元素。
  • 我明白了,但我的 list1 和 list2 不会有相同的 len。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-16
  • 2015-10-28
  • 2011-12-16
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多