2017-09-08 34 views
0

我有这2列出的清单列表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]] 

(这仅仅是一个只有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函数中做到这一点?我想为此提供一个简单而直接的功能。非常感谢您的参与!

+0

你试过了什么吗?你能告诉我们你做了什么吗? – Arount

回答

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 
+0

谢谢先生,这正是我需要的! – Rommel

0

这里有一个办法做到这一点使用列表理解

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

的匹配情况下,内表的构造使得它稍微不可读。这将是更可读的“deflattened”的形式与循环:

def merge_lists(list1, list2): 
    lst = [] 
    for x, y in zip(list1, list2): 
     if x[1] == y[1]: 
      lst.append([*x[:2], y[2], x[3], y[4]]) 
     else: 
      lst.extend((x, y)) 
    return lst 
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] 

因此使用拉链,你可以工作两个你的名单在同一时间。

+0

感谢您的提示! – Rommel

0

这里有一个方法,该列表转换成一个字典,并采取的事实,即从list2重叠的项目将只覆盖他们list1同行:

combined_list = list1 + list2 
final_dict = {tuple(i[:2]):tuple(i[2:]) for i in combined_list} 
> {('A', 14): ('Y', 0, 200), 
    ('B', 15): ('M', 0, 400), 
    ('C', 16): ('F', 50, 60), 
    ('C', 17): ('G', 0, 600)} 
merged_list = [list(k) + list (final_dict[k]) for k in final_dict] 
> [['C', 16, 'F', 50, 60], 
    ['B', 15, 'M', 0, 400], 
    ['C', 17, 'G', 0, 600], 
    ['A', 14, 'Y', 0, 200]] 

如果列表的顺序是非常重要的,你可以在最后进行排序或使用OrderedDict首先创建合并。

0

你的“加盟”算法可以在每个项目上独立工作,很简单:

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

此函数总是返回元组:独身在一般情况下平等或夫妻的CAS。

您可以应用此功能的两个列表list1list2,使用map()功能。但结果将是一个元组列表(实际上在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) 

你得到你所期望的。