2014-02-07 2 views
0

Я новичок в Python. У меня есть следующий код, который является частью строкового алгоритма, который я сейчас разрабатываю.Python: более читаемый список осмысления

>>> newlist=[] 
>>> i =0 

>>> for x in range(len(list1)): 
     new_item = [y for y in list1[i] if y not in list2[i]] 
     newlist.append(new_item) 
     i=i+1 

>>> print newlist 

Мне нравится делать это с использованием понимания списка, поскольку я прочитал, что оптимизирована производительность. Может ли кто-нибудь предложить мне метод.

спасибо.

[Редактировать]

пример:

list1= [[['pat'],['cut'],['rat']], [['sat','pat'],['cut','pat']],[['instructor','plb','error0992'],['instruction','address','00x0993'],['data','address','017x112']] 

list2= [[['pat'], ['cut'], ['rat']], [['sat', 'pat']], [['instructor', 'plb', 'error0992'], ['instruction', 'address', '00x0993']]] 

Таким образом, новый список,

newlist= [[], [['cut', 'pat']], [['data', 'address', '017x112']]] 
+0

вы можете дать нам до и после примера того, что вы ожидаете от входов и выходов? Только так я вижу конечную цель – owen79

ответ

3

Если вы просто хотите, чтобы все элементы, которые находятся в одном списке, а не в другом, я хотел бы предложить, глядя в питон set s. Они не допускают дубликатов, но преимущества производительности и удобства чтения велики.

Вы бы осуществить это так:

newlist = list(set(list1).difference(set(list2))) 

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

[list(set(a)-set(b)) for a, b in zip(list1, list2)] 

Если вопросам заказа, или у вас есть дубликаты, то один список понимания вы были выше, должны сделать трюк, просто обернуть его как лямбда-функции, чтобы сделать его более удобным для чтения:

single_item = lambda i: [y for y in list1[i] if y not in list2[i]] 
newlist = [single_item(i) for i in enumerate(list1)] 
+2

Вы должны сделать что-то вроде '[list (set (a) -set (b)) для (a, b) в zip (list1, list2)]', поскольку 'list1' и' list2' - это список списков. – sloth

+0

@DominicKexel Вы совершенно правы, теперь редактируете. –

+0

Я отредактировал вопрос. Эта реализация выглядит хорошо. Я попробую это. – Manoj

2

Это вложенный список понимание, что делает то же самое, как ваш код (хотя и не будет сохранить значение i).

newlist = [[y for y in list1[i] if y not in list2[i]] for i in range(len(list1))] 
+0

Вложенные списки comps не читаются чрезвычайно ... –

+0

Я не думал, что плакат особенно хотел, чтобы решение было чрезвычайно читаемым. Извините, если это вызывает недоразумение. – icedtrees

+0

Вы должны прочитать название вопроса. –

1

TL; DR:[[y for y in list1[i] if j not in list2[i]] for i in enumerate(list1)]

Вы должны использовать enumerate вместо range(len()) не-идиомы. Вы также можете захотеть сделать это генераторным выражением. Либо с бетонным вложенным списком:

([y for y in list1[i] if j not in list2[i]] for i in enumerate(list1))

или не

((y for y in list1[i] if j not in list2[i]) for i in enumerate(list1))