Efficienza della deduplicazione in Python

0

Domanda

Ho scritto un po ' di codice che attributo, per ogni elemento di una lista, un punteggio... Per fare questo, ho bisogno di fare questo (semplificato), del codice):

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])

output: [[1, 1], [2, 3], [3, 0]]

Il problema è, se leggi questo codice, che non è ottimizzato per un grande enumerazione (più di 7000 gruppi e 100 nomi di gruppi)...

Spero che qualcuno mi può aiutare ? Grazie mille

1

Migliore risposta

3

IIUC, si desidera ottenere la lunghezza del set di nomi univoci non already_chose meno il numero di nomi already_chose.

Questo è facilmente ottenibile con python set e un elenco di comprensione. Il vantaggio nell'utilizzo di python set, è che le operazioni sono molto veloce a causa di hashing di tutti gli elementi.

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

output: [[1, 1], [2, 3], [3, 0]]

NB. potrebbe essere più utile come il dizionario di comprensione:

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

output: {1: 1, 2: 3, 3: 0}

2021-11-14 19:21:50

Non sapevo set().differenza() !!!! Thk
BiMathAx STUDIO

In altre lingue

Questa pagina è in altre lingue

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