Reputation: 361
I´m looking to merge 2 lists of lists. In the first piece of code I can merge 2 lists of strings without the repeated elements! That is what I´m looking for but with 2 lists of lists (of strings):
list1 = ['a', 'b', 'c', 'd']
list2 = ['c', 'd', 'e', 'f']
# List merge without dupe
list1.extend([element for element in list2 if element not in list1])
print list1
>>>
['a', 'b', 'c', 'd', 'e', 'f']
What I´m looking for:
list1=[["artur","1/1/2018","0.5"],
["paco","1/1/2018","2.11"],
["pepe","1/1/2018","11.2"],
["artur","2/1/2018","0.5"],
["paco","2/1/2018","2.11"],
["pepe","2/1/2018","11.2"]]
list2=[["artur","1/1/2018","Estable"],
["paco","1/1/2018","Critico"],
["pepe","1/1/2018","Critico"],
["artur","2/1/2018","Estable"],
["paco","2/1/2018","Critico"],
["pepe","2/1/2018","Critico"]]
#desired output:
>>>list1
[["artur","1/1/2018","0.5","Estable"],
["paco","1/1/2018","2.11","Critico"],
["pepe","1/1/2018","11.2","Critico"],
["artur","2/1/2018","0.5","Estable"],
["paco","2/1/2018","2.11","Critico"],
["pepe","2/1/2018","11.2","Critico"]]
EDITION:
if my list will be:
list1=[["artur,1/1/2018,0.5"],
["paco,1/1/2018,2.11"],
["pepe,1/1/2018,11.2"],
["artur,2/1/2018,0.5"],
["paco,2/1/2018,2.11"],
["pepe,2/1/2018,11.2"]]
list2=[["artur,1/1/2018,Estable"],
["paco,1/1/2018,Critico"],
["pepe,1/1/2018,Critico"],
["artur,2/1/2018,Estable"],
["paco,2/1/2018,Critico"],
["pepe,2/1/2018,Critico"]]
I had to convert a csv to list but I have this kind of list and not what I´m asked in the fist lines of the question!
Upvotes: 0
Views: 144
Reputation: 24593
Try:
ziplist = list(zip(list1, list2))
outlist = []
for z in ziplist:
for i in z[1]:
if i not in z[0]:
z[0].append(i)
outlist.append(z[0])
print(outlist)
Output:
[['artur', '1/1/2018', '0.5', 'Estable'],
['paco', '1/1/2018', '2.11', 'Critico'],
['pepe', '1/1/2018', '11.2', 'Critico'],
['artur', '2/1/2018', '0.5', 'Estable'],
['paco', '2/1/2018', '2.11', 'Critico'],
['pepe', '2/1/2018', '11.2', 'Critico']]
Upvotes: 0
Reputation: 2612
You could do it with a for
loop using enumerate()
:
list1=[["artur","1/1/2018","0.5"],
["paco","1/1/2018","2.11"],
["pepe","1/1/2018","11.2"],
["artur","2/1/2018","0.5"],
["paco","2/1/2018","2.11"],
["pepe","2/1/2018","11.2"]]
list2=[["artur","1/1/2018","Estable"],
["paco","1/1/2018","Critico"],
["pepe","1/1/2018","Critico"],
["artur","2/1/2018","Estable"],
["paco","2/1/2018","Critico"],
["pepe","2/1/2018","Critico"]]
for i, item in enumerate(list2):
list1[i].append(item[-1])
>>> pprint(list1)
[['artur', '1/1/2018', '0.5', 'Estable'],
['paco', '1/1/2018', '2.11', 'Critico'],
['pepe', '1/1/2018', '11.2', 'Critico'],
['artur', '2/1/2018', '0.5', 'Estable'],
['paco', '2/1/2018', '2.11', 'Critico'],
['pepe', '2/1/2018', '11.2', 'Critico']]
Edit:
list1=[["artur,1/1/2018,0.5"],
["paco,1/1/2018,2.11"],
["pepe,1/1/2018,11.2"],
["artur,2/1/2018,0.5"],
["paco,2/1/2018,2.11"],
["pepe,2/1/2018,11.2"]]
list2=[["artur,1/1/2018,Estable"],
["paco,1/1/2018,Critico"],
["pepe,1/1/2018,Critico"],
["artur,2/1/2018,Estable"],
["paco,2/1/2018,Critico"],
["pepe,2/1/2018,Critico"]]
# slice assignment
list1[:] = [''.join(item).split(',') for item in list1]
list2[:] = [''.join(item).split(',') for item in list2]
for i, item in enumerate(list2):
list1[i].append(item[-1])
>>> pprint(list1)
[['artur', '1/1/2018', '0.5', 'Estable'],
['paco', '1/1/2018', '2.11', 'Critico'],
['pepe', '1/1/2018', '11.2', 'Critico'],
['artur', '2/1/2018', '0.5', 'Estable'],
['paco', '2/1/2018', '2.11', 'Critico'],
['pepe', '2/1/2018', '11.2', 'Critico']]
Upvotes: 1
Reputation: 36691
A nested for loop that checks the first 2 element of each sub-list and appends when a match is found should work:
for sub1 in list1:
for sub2 in list2:
if sub1[:2] == sub2[:2]:
sub1.append(sub2[-1])
continue
Output:
>>>list1
[['artur', '1/1/2018', '0.5', 'Estable'],
['paco', '1/1/2018', '2.11', 'Critico'],
['pepe', '1/1/2018', '11.2', 'Critico'],
['artur', '2/1/2018', '0.5', 'Estable'],
['paco', '2/1/2018', '2.11', 'Critico'],
['pepe', '2/1/2018', '11.2', 'Critico']]
Upvotes: 3