установить операцию над списком элементов - PullRequest
0 голосов
/ 23 июня 2018

У меня есть список, содержащий тысячи наборов, подобных этому:

set_list = [a, b, c, d]

каждый набор в списке выглядит примерно так:

a = set([1, 2, 3, 4, 5])
b = set([4, 5, 6, 7, 7, 9])
c = set([1, 2, 6, 8, 10, 12, 45])
d = set([11, 3, 23, 3, 4, 44])

Я хотел бы выполнить операцию набора: X- (YUZUAUB ...... и т. Д.) Для каждого набора в списке, например, это будет выглядеть примерно так: после применения этой операции ко всем элементам в set_list новые элементы выглядят так:

a = a.difference(b.union(c, d))
b = b.difference(c.union(a, d))
c = c.difference(d.union(b, a))
d = d.difference(a.union(c, b))

как мне это сделать?

Ответы [ 4 ]

0 голосов
/ 23 июня 2018

Это повторная реализация ответа NPE с использованием collections.Counter из стандартной библиотеки:

from collections import Counter

def mutual_difference(set_list):
    # create a multiset out of the union of all sets
    union = Counter()
    for s in set_list:
        union.update(s)

    new_set_list = []
    for s in set_list:
        # subtract s from the union and discard 0-count elements
        union.subtract(s)
        union += {}

        # take the difference
        new_set_list.append(s.difference(union))

        # add s to the union again
        union.update(s)

    return new_set_list

Пример:

>>> mutual_difference([{1,2}, {2,3}, {1,4,5}])
[set(), {3}, {4, 5}]
0 голосов
/ 23 июня 2018

Если я правильно понимаю, вам нужна разница для каждого набора и объединение остальных наборов.Я бы использовал цикл и functools.reduce и operator.or_:

Настройка

import functools
import operator

a = set([1, 2, 3, 4, 5])
b = set([4, 5, 6, 7, 7, 9])
c = set([1, 2, 6, 8, 10, 12, 45])
d = set([11, 3, 23, 3, 4, 44])
set_list = [a, b, c, d]

Зацикливание и сохранение результатов

# I don't know what you want to do with the results so
# I'll save them in a list...
results = [] 
for i in set_list:
    list_copy = list(set_list)
    list_copy.remove(i)
    r = i - functools.reduce(operator.or_, list_copy)
    results.append(r)

print(results)
# prints [set(), {9, 7}, {8, 10, 12, 45}, {11, 44, 23}]
0 голосов
/ 23 июня 2018
[value - {item for subset in set_list[0:index] + set_list[index + 1:] for item in subset} for index, value in enumerate(set_list)]

, что означает:

result = []
for index, value in enumerate(set_list):
    union = {
        item
        for subset in set_list[0:index] + set_list[index + 1:]
        for item in subset
    }
    result.append(value - union)

print(result)

Выходы:

[set(), {9, 7}, {8, 10, 12, 45}, {11, 44, 23}]
0 голосов
/ 23 июня 2018

Одной из возможностей является использование модуля multiset для предварительного вычисления объединения всех элементов в set_list, например, так:

from multiset import Multiset
union = sum(set_list, Multiset())
set_list = [s - (union - s) for s in set_list]

Здесь union - s вычисляет Y ∪ Z ∪ A ∪ B... в вашей записи.

См. Ответ Аран-Фея о том же методе, реализованном (более подробно) с использованием только стандартной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...