2017-02-07 6 views
0

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

Item_No.  features 
    A  ['X','Y','Z'] 
    B   ['X','Y'] 
    C   ['Y'] 
    D   ['S'] 

Я хотел бы видеть, если Пункт А имеет какой-либо общий признак с другими деталями. В этом случае я хочу получить что-то вроде этого:

Item_No. features  Common 
    A  ['X','Y','Z'] B,C 
    B  ['X','Y']  A,C 
    C   ['Y']   A,B 
    D   ['S']   0 

Как я могу продолжить с этим на python?

+2

Вы сначала что-то пробовали? –

+0

Почему у B, C нет ничего в * общем *? Вы должны исправить пример или указать * common *. ** OT: ** Теги, добавленные в вопрос, выглядят немного странно. – nitzel

+0

@nitzel - Отредактировано. – Prometheus

ответ

1
def common(x,y): 
    """Do list x and y have an element in common?""" 
    for e in x: 
     if e in y: 
      return True 
    return False 

#listnames and their content 
data = [('A',['X','Y','Z']), 
     ('B',['X','Y']), 
     ('C',['Y']), 
     ('D',['S'])] 

# touples of listnames and an array of listnames it 
data_common = [] overlaps with 
# try common on each pair of lists saving their names. 
for N,A in d: 
    data_common.append((N,[n for n,a in data if(n is not N and common(A,a))])) 
print(data_common) 

Выход: [('A', ['B', 'C']), ('B', ['A', 'C']), ('C', ['A', 'B']), ('D', [])]

Это довольно дорого, около O(m^2*n^2), m=max(len(data[,1])), n=len(data) и может, конечно, быть оптимизированы, так как каждый лист фактически проверяется на друг друга дважды.

+0

Жаль, что я был немного занят после того, как отправил свой вопрос и не смог опубликовать свой рабочий код. Спасибо тонну @nitzel. – Prometheus