Python 合并函数仅适用于有序列表

Python 合并函数仅适用于有序列表,python,python-3.x,list,Python,Python 3.x,List,我有两个列表作为输入: 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

我有两个列表作为输入:

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',0400])

如果我的列表在我的列表中有不同的顺序,为了获得第一个所需的输出,我必须在我的函数中修改什么!?我使用Python3。谢谢大家!

稍后编辑:

合并规则: 当
list1[listindex][1]==list2[listindex][1]
(例如:当
14==14
)时,在
list1
->
list2[2]
list2[4]
(例如:'Y'和200)中替换,如果不只是将不匹配的列表从
list2
添加到
list1
(如我所需的输出)并保留列表1中不匹配的部分(例如:
['C',16',F',50,60]

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

编辑.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 

^^这可能有效,仍在测试中

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

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]]

不确定这里的合并逻辑是什么。在我的原始帖子中添加了合并规则。嗯,如果我在列表2中添加一个额外的列表:['S',20',Y',0,200],我实际上不会在output@TatuBogdan:zip将始终截断为短接的iterable。因此,如果您提供一个包含3个元素的列表和一个包含10个元素的列表,您将从较长的列表中获得前3个元素。我明白了,但是我的列表1和列表2的len不相同。