Python удаляет дублирующиеся кортежи из словаря

1

У меня есть этот словарь, который имеет кортежи как ключи. Все эти кортежи получили два значения, я буду использовать буквы в качестве значений, чтобы все было просто, например, кортеж (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 над ним одновременно. Любая помощь или советы будут оценены :)

  • 1
    может быть, sort элементы кортежа?
  • 0
    В этом случае вы должны использовать frozenset s вместо кортежей в качестве ключей, и вы получите это свойство бесплатно.
Теги:
python-3.x
dictionary
tuples

2 ответа

0
Лучший ответ

Вы можете преобразовать ключи в список отдельно от 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
  • 0
    Не должно ли быть и? Я не хочу удалять key_tuple, если дубликатов нет
  • 0
    Нет. Левая сторона этого ( key_tuple in dupes ) всегда должна возвращать False, поэтому только правая сторона ( (key_tuple[1], key_tuple[0]) in dupes ) имеет какой-либо эффект. Я только включил это, чтобы помочь показать, что логика здесь. Если вы измените его на and , то оператор никогда не вернет True.
Показать ещё 1 комментарий
1

Ваше утверждение if неверно. Так должно быть:

if (key[1], key[0]) not in dupes:
        dupes.append(key)

В принципе, вы просите, чтобы текущий ключ с инвертированным элементом еще не присутствовал в списке dupes.

Ваша часть кода не работает, потому что вы смотрите на перекрытия и вставляете текущий ключ, если присутствует инвертированный. Таким образом, "одиночные" ключи, т. dupers Те, у которых нет своего аналога, никогда не вставляются в dupers.

  • 0
    Я изменил оператор if, и все еще присутствуют дураки

Ещё вопросы

Сообщество Overcoder
Наверх
Меню