2013-06-11 2 views
2

Я пытаюсь найти уникальные различия между 5 различными списками.Уникальные функции между несколькими списками

Я видел несколько примеров того, как найти различия между двумя списками, но не смог применить их к нескольким спискам.

Было легко найти сходство между 5 списками.

Пример:

list(set(hr1) & set(hr2) & set(hr4) & set(hr8) & set(hr24)) 

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

Кто-нибудь знает, как это сделать?

+1

Удивление это никогда не было предложено до – jamylak

+0

Это [SO ответ] (https://stackoverflow.com/a/49118803/307454) должен работать, но по какой-то причине не удается. – lifebalance

ответ

2

Как это? Скажем, у нас есть входные списки [1, 2, 3, 4], [3, 4, 5, 6] и [3, 4, 7, 8]. Мы хотели бы вытащить [1, 2] из первого списка, [5, 6] из второго списка и [7, 8] из третьего списка.

from itertools import chain 

A_1 = [1, 2, 3, 4] 
A_2 = [3, 4, 5, 6] 
A_3 = [3, 4, 7, 8] 

# Collect the input lists for use with chain below 
all_lists = [A_1, A_2, A_3] 

for A in (A_1, A_2, A_3): 
    # Combine all the lists into one 
    super_list = list(chain(*all_lists)) 
    # Remove the items from the list under consideration 
    for x in A: 
    super_list.remove(x) 
    # Get the unique items remaining in the combined list 
    super_set = set(super_list) 
    # Compute the unique items in this list and print them 
    uniques = set(A) - super_set 
    print(sorted(uniques)) 
+0

Еще один студент-градирник, с которым я работаю, использовал этот код, и он отлично поработал! Спасибо за предложение – dhop

+0

Не могли бы вы ответить на соответствующий вопрос [SO вопрос] (https://stackoverflow.com/questions/49118597/код к найти неуникальные-элементы между списками-наборами/49120680 # 49120680)? – lifebalance

4

Не могли бы вы помочь? Я предполагаю список списков, чтобы проиллюстрировать этот пример. Но вы можете изменить, чтобы структура данных удовлетворить ваши потребности

from collections import Counter 
from itertools import chain 

list_of_lists = [ 
    [0,1,2,3,4,5], 
    [4,5,6,7,8,8], 
    [8,9,2,1,3] 
] 
counts = Counter(chain.from_iterable(map(set, list_of_lists))) 
uniques_list = [[x for x in lst if counts[x]==1] for lst in list_of_lists] 
#uniques_list = [[0], [6, 7], [9]] 

Edit (на основе некоторых полезных замечаний):

counts = Counter(chain.from_iterable(list_of_lists)) 
unique_list = [k for k, c in counts.items() if c == 1] 
+0

'counts [i] == 1' должно быть' counts [x] == 1' – bnlucas

+0

Кроме того, нет необходимости в 'map (set, lists_of_lists)', 'chain.from_iterable (list_of_lists)' работает одинаково , – bnlucas

+0

Да, но если в списке есть дубликаты, это просто устраняет их. Просто небольшая оптимизация. :) – karthikr

0

Хорошо, я новичок в Python и был не в состоянии следовать предложения выше очень хорошо, но был в состоянии понять мою проблему, используя следующий код, в основном просто набор парных сравнений.

x1 = [x for x in hr1 if x not in hr2] 
x2 = [x for x in x1 if x not in hr4] 
x3 = [x for x in x2 if x not in hr8] 
x4 = [x for x in x3 if x not in hr24] 
len(x4) 
Смежные вопросы