2013-07-13 2 views
2

У меня есть список список, созданный какпоиск элемента в подсписка в другом списке списка позиции

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

и у меня будет еще один список, как

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

Итак, я хочу, чтобы проверить если элемент в небольшом списке содержит в этом конкретном индексе biglist, если он не добавляется к нему.

так, что делает

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

так, 'C' из кулака подсписка smalllist был добавлен в первый подсписка biglist. но не для второго и третьего.

Я попытался как

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

но получить ошибки

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

Как это сделать?

Спасибо

ответ

5

Возможно, вы должны попробовать это:

// Это будет работать только, если smalllist короче 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) 

ДЕМО:

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

да, я всегда хожу п или циклы в крайнем случае, если я не найду никакого понимания списка, задайте операции. Я действительно работал таким образом, прежде чем видеть ваш ответ, и вы читали мои мысли. Большое спасибо. Я не знаю, насколько быстро он сравнивается с другими методами. – Ananta

+1

На Python3: mine: '1.378441910026595'; ovgolovin's: '6.968630363931879'; bsoist's: '5.993933744030073' –

+1

+1 для скорости - как для ответа, так и для реализации @PeterVaro Мне было бы интересно узнать, были ли другие, если мы использовали наборы, а не списки. (редактирование - данные скорости, я имею в виду) – bsoist

2

По какой-то причине extend в Python не возвращает список после расширения. Таким образом, ll в вашем случае - None. Просто поставьте ll=each[0] на вторую строку в цикле, и ваше решение должно начать работать.

По-прежнему, я не понимаю, почему вы не держите свои элементы в set s в первую очередь. Это позволит избежать конверсии с list в set, а затем назад.

Я бы просто установил or вместо добавления в список, а затем отфильтровывал дубликаты, используя set, а затем до 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']] 

сохраняющих элементы в set с, в первую очередь, кажется, самый быстрый в Python 3 даже для такого небольшого количества элементов в каждом наборе (см комментарии):

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'}] 
+0

+1 для рекомендаций наборов и заданий – bsoist

+0

Спасибо, да, как вы сказали, я изменил его, чтобы установить его в первую очередь – Ananta

+0

Это решение намного медленнее, чем я предложил. '6.968630363931879' vs' 1.378441910026595' –

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

Спасибо, сколько опыта у вас есть, чтобы подумать об одном лайнере, таком как понимание этого списка? – Ananta

+0

Это решение намного медленнее, чем я предложил. '5.993933744030073' vs' 1.378441910026595' –

+0

Ответ на этот вопрос очень сложный. Я склонен думать в математических терминах, так вот как я взял такие вещи. Просто имейте в виду, что это не быстрее, чем выполнение циклов, и их может быть труднее читать. Решение Питера лучше, но я не видел его, пока не опубликовал. – bsoist

Смежные вопросы