基于索引加入2个列表列表的操作

时间:2017-09-08 11:51:16

标签: python 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]]

(这只是一个只有3个列表的示例,我有更多列表,但它们采用完全相同的格式并应用相同的规则)

这将是我想要的输出:

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

这是我计算finalList的原则:

list1[listindex][1] == list2[listindex][1](例如:14 = 14时),请替换为list1 -> list2[2]list2[4](例如:' Y'和200),如果不是将list2中不匹配的列表原样添加到list1(就像在我想要的输出中一样),并保持list1中不匹配的列表(例如:['C', 16, 'F', 50, 60])。 我如何在python 3函数中执行此操作?我想要一个简单而直接的功能。非常感谢你的时间!

5 个答案:

答案 0 :(得分:1)

您可以在函数中使用if语句来应用所有规则。

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

答案 1 :(得分:0)

以下是使用列表理解进行此操作的一种方法:

  public class Request {
    Event event;
    Gallery gallery;
    List<Activity> activity;

}

匹配案例的内部列表的构造使其略微不可读。它可以通过 for 循环以“deflattened”形式显示:

lst =  [i for x, y in zip(list1, list2) 
          for i in (([*x[:2], y[2], x[3], y[4]],) if x[1] == y[1] else (x, y))]

print(lst)
# [['A', 14, 'Y', 10, 200], ['B', 15, 'M', 30, 400], ['C', 16, 'F', 50, 60], ['C', 17, 'G', 0, 600]]

答案 2 :(得分:0)

要同时处理这两个列表,您可以使用zip() Docs Here

例如:

for value in zip(list1, list2):
       print (value[0], value[1])

将返回:

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

所以使用zip你可以同时在你的两个列表上工作。

答案 3 :(得分:0)

这是将列表转换为字典的一种方法,并利用EVENT TYPE=KEYPRESS CHAR="a" MODIFIERS="ctrl" EVENT TYPE=KEYPRESS CHAR="c" MODIFIERS="ctrl" WAIT SECONDS=1 URL GOTO=javascript:(function(){var<SP>t=document.createElement("input");t.setAttribute("id","tempInput");document.body.appendChild(t);})(); EVENT TYPE=CLICK SELECTOR="#tempInput" BUTTON=0 URL GOTO=javascript:(function(){var<SP>t=document.querySelector("#tempInput");document.body.removeChild(t);})(); 中重叠项目只会覆盖其list2对应项的事实:

list1

如果列表的排序很重要,您可以在最后排序或使用OrderedDict首先创建合并。

答案 4 :(得分:0)

你的加入&#34;算法可以独立地处理每个项目,并且很简单:

def join_list(item1, item2):
    if item1[1] == item2[1]:
        result = item1[:]
        result[2] = item2[2]
        result[4] = item2[4]
        return (result,)
    return item1[:], item2[:]

此函数总是返回元组:单元格中的单例或一般情况下的情侣。

您可以使用list1功能将此功能应用于您的两个列表list2map()。但结果将是一个元组列表(实际上是Python 3中的生成器),因此您需要展平结果:

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

joined = [x
          for row in map(join_list, list1, list2)
          for x in row]
print(joined)

你得到了你所期望的。