Пересечение из разных ключей внутри Python словаря - PullRequest
0 голосов
/ 20 января 2020

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

dict_all[key] = {"id_yes" : None, "id_no" : None ,"ZUW_yes": set(), "ZUW_no": set(), "missing_ZUW_yes" : set(), "missing_ZUW_no" : set()}

Прежде чем этот диктант заполняется, кроме

"missing_ZUW_yes" : set(), "missing_ZUW_no" : set()

эти два должны взять пропущенные идентификаторы из сравнения "ZUW_yes": set(), "ZUW_no": set(). Это означает, что missing_ZUW_yes должен содержать объект, который находится в ZUW_no, но не в ZUW_yes.

Я попытался построить пересечение, выполнив это:

def intersection(dict_all):
overlap = [k for k in dict_all[key]["ZUW_yes"] if in dict_all[key]["ZUW_no"]]

В следующем I хотел сравнить одиночные наборы «да» и «нет» с пересечением, чтобы найти различия и заполнить пропущенные записи dict.

Я делал это раньше с некоторыми циклами for, но это заняло слишком много времени, потому что данные внутри dict довольно велики ..

1 Ответ

2 голосов
/ 20 января 2020

Учитывая, что ваши наборы наборы , вы можете просто использовать правильные операции набора, которые они предоставляют: ZUW_no - ZUW_yes даст вам все, что находится в ZUW_no, но не в ZUW_yes.

Если вы предпочитаете более грамотную версию, - является псевдонимом для set_a.difference(b). Обратите внимание, что форма метода также может принимать несколько параметров, поэтому a - b - c - d (он же a - (b | c | d)) также можно записать a.difference(b, c, d).

set имеет ряд очень полезных операций над множествами Из коробки вы, вероятно, захотите взглянуть, большинство из них довольно понятны (на мой взгляд, единственно неоднозначным является symmetric_difference, поскольку он вычисляет (a-b) | (b-a) aka (a|b) - (a&b), в то время как его именование может также это будет сокращение от a-b, b-a)

...