J'ai une liste de chaînes qui va comme ceci:

1;213;164
2;213;164
3;213;164
4;213;164
5;213;164
6;213;164
7;213;164
8;213;164
9;145;112
10;145;112
11;145;112
12;145;112
13;145;112
14;145;112
15;145;112
16;145;112
17;145;112
1001;1;151
1002;2;81
1003;3;171
1004;4;31

Je voudrais supprimer tous les doublons où les 2 seconds numéros sont les mêmes. Donc, après l'avoir exécuté via le programme, j'obtiendrais quelque chose comme ceci:

1;213;164
9;145;112
1001;1;151
1002;2;81
1003;3;171
1004;4;31

Mais quelque chose comme

8;213;164
15;145;112
1001;1;151
1002;2;81
1003;3;171
1004;4;31

Serait également correct.

0
vanjavk 2 juin 2020 à 12:42

3 réponses

Meilleure réponse

Voici une astuce simple et rapide que vous pouvez utiliser (en supposant que l est votre liste):

list({ s.split(';', 1)[1] : s for s in l }.values())

Pas besoin d'importer quoi que ce soit, et aussi vite que possible.

En général, vous pouvez définir:

def custom_unique(L, keyfunc):
    return list({ keyfunc(li): li for li in L }.values())
1
One Lyner 2 juin 2020 à 12:19

Vous pouvez regrouper les éléments par cette clé, puis utiliser le premier élément de chaque groupe (en supposant que l est votre liste).

import itertools
keyfunc = lambda x: x.split(";", 1)[1]
[next(g) for k, g in itertools.groupby(sorted(l, key=keyfunc), keyfunc)]
1
Tom Ron 2 juin 2020 à 10:13

Voici un code sur les quelques premiers éléments, il suffit de changer ma liste avec la vôtre:

x = [
'7;213;164',
'8;213;164',
'9;145;112',
'10;145;112',
'11;145;112',
]
new_list = []
for i in x:
    check = True
    s_part = i[i.find(';'):]
    for j in new_list:
        if s_part in j:
            check = False
    if check == True:
        new_list.append(i)

print(new_list)

Production:

['7;213;164', '9;145;112']
0
snatchysquid 2 juin 2020 à 09:49