简体   繁体   中英

Python Extracting items from a sublist if they match an item in another list's sublist

I apologize for the confusing title. I'm wondering what's the best way to compare two lists of sublists, and if an item in a sublist matches an item in the other list's sublist, the former list gets extended with the latter's items. I know this sounds very confusing, so here are the details:

I have two lists of sublists:

listA = [['x', 'apple', 'orange'], ['y', 'cat', 'dog'], ['z', 'house', 'home']]
listB = [['z', 7, 8, 9], ['x', 1, 2, 3], ['y', 4, 5, 6]]

Now I would like to extend listA such that it contains the values in listB if the first item in listA 's sublist matches that of listB 's sublists. So essentially, the end result should be the following:

listA = [['x', 'apple', 'orange', 1, 2, 3], ['y', 'cat', 'dog', 4, 5, 6], ['z', 'house', 'home', 7, 8, 9]]

Here's what I've tried:

for (sublistA, sublistB) in zip(listA, listB):
    if sublistA[0] == sublistB[0]:
        sublistA.extend(sublistB[1], sublistB[2], sublistB[3])

However, it seems like the code fails at the if statement. When I print listA, all I get is its original items:

>>> print(listA)
[['x', 'apple', 'orange'], ['y', 'cat', 'dog'], ['z', 'house', 'home']]

Why is it that the if statement isn't working? And what methods are available to do this matching followed by extraction of items?

Edit: As per idjaw's suggestion, I created a third list and tried doing the above for it again. However, I seem to be getting back an empty list as the if statement seems to not work again. Here's the code:

listC = []
for (sublistA, sublistB) in zip(listA, listB):
    if sublistA[0] == sublistB[0]:
        listC.append(sublistA[0], sublistA[1], sublistA[2], 
                     sublistB[1], sublistB[2], sublistB[3])
print(listC)

Output: []

Here is one way of doing that by building a dict to allow easier lookup to the lists to add to:

Code:

lookup = {x[0]: x for x in listA}
for sublist in listB:
    lookup.get(sublist[0], []).extend(sublist[1:])

Test Code:

listA = [['x', 'apple', 'orange'], ['y', 'cat', 'dog'], ['z', 'house', 'home']]
listB = [['z', 7, 8, 9], ['x', 1, 2, 3], ['y', 4, 5, 6]]

lookup = {x[0]: x for x in listA}
for sublist in listB:
    lookup.get(sublist[0], []).extend(sublist[1:])

print(listA)

Results:

[
    ['x', 'apple', 'orange', 1, 2, 3], 
    ['y', 'cat', 'dog', 4, 5, 6], 
    ['z', 'house', 'home', 7, 8, 9]
]

maybe your code could be this

listA = [['x', 'apple', 'orange'], ['y', 'cat', 'dog'], ['z', 'house', 'home']]
listB = [['z', 7, 8, 9], ['x', 1, 2, 3], ['y', 4, 5, 6]]



for la in listA:
    for lb in listB:
        if la[0] == lb[0]:
            for i in lb[1:]:
                la.append(i)

print(listA)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM