У меня есть этот словарь, который имеет кортежи как ключи. Все эти кортежи получили два значения, я буду использовать буквы в качестве значений, чтобы все было просто, например, кортеж (a, b).
Порядок двух значений не имеет значения, это означает, что (a, b) по существу совпадает с (b, a) (или дублированием). Поэтому я попытался написать что-то, что удалит все эти избыточные пары ключей, значений, только это не сработает, и я серьезно застрял с ним. Я уверен, что это просто что-то простое, я не замечаю, несмотря на то, что не могу понять.
Я думал, что это сработает:
def undupe_overlaps(overlaps):
dupes = []
for key, item in overlaps.items():
if (key[1], key[0]) in overlaps:
dupes.append((key[1], key[0]))
for item in dupes:
overlaps.pop(item)
return overlaps
overlaps - словарь, и я использую дубликаты списков, потому что вы не можете удалять вещи из dict и loop над ним одновременно. Любая помощь или советы будут оценены :)
Вы можете преобразовать ключи в список отдельно от dict, а затем изменить dict, когда вы перебираете ключи.
def undupe_overlaps(overlaps):
dupes = set()
for key_tuple in list(overlaps.keys()):
if key_tuple in dupes or (key_tuple[1], key_tuple[0]) in dupes:
overlaps.pop(key_tuple)
dupes.add(key_tuple)
return overlaps
key_tuple in dupes
) всегда должна возвращать False, поэтому только правая сторона ( (key_tuple[1], key_tuple[0]) in dupes
) имеет какой-либо эффект. Я только включил это, чтобы помочь показать, что логика здесь. Если вы измените его на and
, то оператор никогда не вернет True.
Ваше утверждение if
неверно. Так должно быть:
if (key[1], key[0]) not in dupes:
dupes.append(key)
В принципе, вы просите, чтобы текущий ключ с инвертированным элементом еще не присутствовал в списке dupes
.
Ваша часть кода не работает, потому что вы смотрите на перекрытия и вставляете текущий ключ, если присутствует инвертированный. Таким образом, "одиночные" ключи, т. dupers
Те, у которых нет своего аналога, никогда не вставляются в dupers
.
sort
элементы кортежа?frozenset
s вместо кортежей в качестве ключей, и вы получите это свойство бесплатно.