Ananta
Ananta

Reputation: 3711

search an item of sublist in another list of list by position

I have a list of list created like

biglist=[['A'], ['C', 'T'], ['A', 'T']]

and I will have another list like

smalllist=[['C'], ['T'], ['A', 'T']]

So, I want to check wheter an item in small list contains in that specific index of biglist, if not append to it.

so, making

biglist=[['A','C'], ['C', 'T'], ['A', 'T']]

so, 'C' from fist sublist of smalllist was added to first sublist of biglist. but not for second and third.

I tried like

dd=zip(biglist, smalllist)
for each in dd:
    ll=each[0].extend(each[1])
    templist.append(list(set(ll)))

but get errors

templist.append(list(set(ll)))
TypeError: 'NoneType' object is not iterable

How to do it?

Thank you

Upvotes: 2

Views: 250

Answers (3)

ovgolovin
ovgolovin

Reputation: 13410

For some reason, extend in Python doesn't return the list itself after extending. So ll in your case is None. Just put ll=each[0] on the second line in the loop, and your solution should start working.

Still, I'm not getting, why you don' keep your elements in sets in the first place. This would avoid you from having to convert from list to set and then backwards.

I would just or sets instead of appending to the list and then filtering out duplicates by resorting to set and then to list.

>>> from itertools import izip
>>> templist = []
>>> for els1,els2 in izip(biglist,smalllist):
    joined = list(set(els1) | set(els2))
    templist.append(joined)


>>> templist
[['A', 'C'], ['C', 'T'], ['A', 'T']]

Keeping elements in sets in the first place seems to be the fastest in Python 3 even for such small amount of elements in each set (see comments):

biglist=[set(['A']), set(['C', 'T']), set(['A', 'T'])]
smalllist=[set(['C']), set(['T']), set(['A', 'T'])]

for els1,els2 in zip(biglist,smalllist):
    els1.update(els2)

print(biglist)

Ouput:

[{'A', 'C'}, {'C', 'T'}, {'A', 'T'}]

Upvotes: 2

bsoist
bsoist

Reputation: 785

[list(set(s+b)) for (s,b) in zip(smalllist,biglist)]

Upvotes: 2

Peter Varo
Peter Varo

Reputation: 12160

Probably, you should try this:

// This will only work, if smalllist is shorter than biglist

SCRIPT:

biglist   = [['A'], ['C', 'T'], ['A', 'T']]
smalllist = [['C'], ['T'], ['A', 'T']]

for i, group in enumerate(smalllist):
    for item in group:
        if item not in biglist[i]:
            biglist[i].append(item)

DEMO:

print(biglist)
# [['A', 'C'], ['C', 'T'], ['A', 'T']]

Upvotes: 5

Related Questions