Tengo este diccionario que tiene tuplas como claves. Todas estas tuplas tienen dos valores, usaré letras como valores para mantener las cosas simples, p. la tupla (a, b).

El orden de los dos valores no importa, esto significa que (a, b) es esencialmente el mismo que (b, a) (o un duplicado). Así que traté de escribir algo que eliminaría todas estas claves redundantes, pares de valores, solo que no funciona y estoy seriamente atrapado. Estoy seguro de que es algo simple que estoy pasando por alto, independientemente de que no pueda resolverlo.

Pensé que esto funcionarí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

Superposiciones es el diccionario y yo uso la lista de engaños porque no puede eliminar cosas de un dict y recorrerlo al mismo tiempo. Cualquier ayuda o consejos serán apreciados :)

1
GotYa 16 oct. 2018 a las 21:30

2 respuestas

La mejor respuesta

Puede convertir las claves en una lista por separado del dict y luego modificar el dict a medida que recorre las claves.

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
CJR 16 oct. 2018 a las 18:38

Su declaración if es incorrecta. Debería ser:

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

Básicamente, está pidiendo que la clave actual, con el elemento invertido, no esté presente dentro de la lista dupes.

Su código no funciona porque está buscando superposiciones e insertando la clave actual si está presente la invertida. De esa manera, las teclas "individuales", es decir, las que no tienen su contraparte, nunca se insertan en dupers.

1
Neb 16 oct. 2018 a las 18:38