2017-02-22 2 views
1

У меня есть два списка списка с равными len в Python (скажем, 3 для этого примера).Массивное извлечение простых элементов из 2 списков списка

A = [['Horse','Duck','Goat'],['Rome','New York'],['Apple','Rome','Goat','Boat']] 

B = [['Carrot','Duck'],['Car','Boat','Plane'],['Goat','Apple','Boat']] 

Я хотел бы совместить элементы в каждой строке и создать новый список общих элементов. Результирующий выходной сигнал мне требуется это:

c = [['Duck'],[],['Apple','Goat','Boat']] 

и

d = [1,0,3] ; where d is a list with the count of common elements at each row. 

Обратите внимание, что в каждой строке списка списков, элементы могут отображаться в любом порядке.

ответ

3

Использование list comprehension и zip:

>>> A = [['Horse','Duck','Goat'],['Rome','New York'], 
     ['Apple','Rome','Goat','Boat']] 
>>> B = [['Carrot','Duck'],['Car','Boat','Plane'], 
     ['Goat','Apple','Boat']] 
>>> c = [[x for x in a if x in b] for a, b in zip(A, map(set, B))] 
>>> d = [len(x) for x in c] 
>>> # or d = list(map(len, c)) # you can omit `list` in python 2.x 
>>> c 
[['Duck'], [], ['Apple', 'Goat', 'Boat']] 
>>> d 
[1, 0, 3] 
+0

- это 'map (set, B)' из-за поиска 'if x in b'? –

+0

@ Ev.Kounis, Да. – falsetru

+0

Тогда +1 для масштабируемости –

2

Альтернативный список понимание:

c = [[x for x in y if x in B[i]] for i, y in enumerate(A)] 
# [['Duck'], [], ['Apple', 'Goat', 'Boat']] 

d = [len(x) for x in c] 
# [1, 0, 3] 

В качестве альтернативы, вы можете также использовать это:

res = [set(x) & set(y) for x, y in zip(A, B)] 
# or [set(x).intersection(y) for x, y in zip(A, B)] as @Chris_Rands suggested 
# [{'Duck'}, set(), {'Apple', 'Goat', 'Boat'}] 

уведомление о том, что формат на последней один не тот, который вы указали, но он использует набор в которые построены для этих видов операций.

+0

Мне нравится использование наборов +1, но, возможно, '[set (x) .intersection (y) для x, y в zip (A, B)]' более аккуратно –

+0

@Chris_Rands Подробнее * аккуратный * как в? .. xD –

+0

Ну, это сохраняет 2-й явный вызов 'set' и docs talk about non-operator form как« более читаемый », но вы тоже слишком хорошо https://docs.python.org /3/library/stdtypes.html#set.intersection –

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