Eficiente de eliminação de duplicação em Python

0

Pergunta

Eu tenho codificadas um pouco de código que atributo, para cada elemento de uma lista, uma pontuação... Para fazer isso, eu preciso fazer isso (simplificado código):

group={1:["Jack", "Jones", "Mike"],
       2:["Leo", "Theo", "Jones", "Leo"],
       3:["Tom", "Jack"]}

already_chose=["Tom","Mike"]
result=[]

for group_id in group:
    name_list = group[group_id]
    y=0;x=0
    repeat=[]
    for name in name_list:
        if name in already_chose:
            y+=1
        elif name not in repeat:
            x+=1
            repeat.append(name)
    score_group=x-y
    result.append([group_id,score_group])

saída: [[1, 1], [2, 3], [3, 0]]

O problema é que, se você ler este código, que não é otimizado para uma grande enumeração (mais de 7000 grupos e 100 nomes de grupos)...

Espero que alguém pode me ajudar ? Muito obrigado

1

Melhor resposta

3

IIUC, que você deseja obter o comprimento do conjunto de nomes exclusivos não already_chose menos o número de nomes na already_chose.

Isso é facilmente conseguido com python conjuntos e uma lista de compreensão. A vantagem na utilização de python define, é que as operações sejam muito rápido, devido à criação de algoritmos hash dos elementos.

[[k, len(set(v).difference(already_chose))-len(set(v).intersection(already_chose))]
 for k,v in group.items()]

saída: [[1, 1], [2, 3], [3, 0]]

NB. pode ser mais útil como dicionário de compreensão:

{k: len(set(v).difference(already_chose))-len(set(v).intersection(already_chose))
 for k,v in group.items()}

saída: {1: 1, 2: 3, 3: 0}

2021-11-14 19:21:50

Eu não sabia o set().diferença (a) !!!! Thk
BiMathAx STUDIO

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................