2 votes

Regroupement d'éléments qui apparaissent ensemble dans une liste distincte

J'ai 2 listes imbriquées et je veux écrire un code qui va parcourir chaque sous-liste des deux listes et regrouper tous les éléments qui apparaissent ensemble dans les deux listes. Le projet sur lequel je travaille comporte en fait d'énormes listes imbriquées, j'ai donc créé les 2 listes suivantes pour simplifier un peu le problème (je n'ai qu'un an d'expérience en python). Si l'on peut créer une fonction qui regroupe les éléments de ces deux listes, je pourrai alors appliquer cette fonction au projet en question. Cette question peut être similaire à : Trouver des éléments qui apparaissent ensemble sur plusieurs listes , mais je n'ai pas pu comprendre le code écrit dans cette question, et comme je l'ai dit, je suis relativement nouveau en python.

my_list = [['a', 'd', 'l'], ['c', 'e', 't'], ['q', 'x'], ['p', 'f', 'd', 'k']

sec_list = [['f', 'd', 'w', 'a'], ['c', 'e', 'u', 'h'], ['q', 'x', 'd', 'z'], ['p', 'k']]

##The output should be something like:

[['a', 'd'], ['c', 'e'], ['q', 'x'], ['p', 'k'], ['f', 'd']]```

Thanks

2voto

user515663 Points 61

Vous pouvez utiliser zip pour itérer sur deux séquences et trouver les éléments communs avec l'intersection des ensembles. Notez qu'il manque un ] de fermeture dans votre code. my_list

my_list = [['a', 'd', 'l'], ['c', 'e', 't'], ['q', 'x'], ['p', 'f', 'd', 'k']]
sec_list = [['f', 'd', 'w', 'a'], ['c', 'e', 'u', 'h'], ['q', 'x', 'd', 'z'], ['p', 'k']]

# each item of my_list and sec_list are lists
# zip allows parallel iteration so l1 and l2 are the pairs of inner lists
# sets are designed for tasks like finding common elements
# the & sign is python for set intersection 
matches = []
for l1, l2 in zip(my_list, sec_list):
    matches.append(list(set(l1) & set(l2)))

cela peut être consolidé dans une liste de compréhension

my_list = [['a', 'd', 'l'], ['c', 'e', 't'], ['q', 'x'], ['p', 'f', 'd', 'k']]
sec_list = [['f', 'd', 'w', 'a'], ['c', 'e', 'u', 'h'], ['q', 'x', 'd', 'z'], ['p', 'k']]
matches = [list(set(l1) & set(l2)) for l1, l2 in zip(my_list, sec_list)]

0voto

Mady Daby Points 1255

Si vous voulez garder les doublons, vous pouvez utiliser cette solution en utilisant collections.Counter :

from collections import Counter

my_list = [['a', 'd', 'l'], ['c', 'e', 't'], ['q', 'x'], ['p', 'f', 'd', 'k', 'k']]

sec_list = [['f', 'd', 'w', 'a'], ['c', 'e', 'u', 'h'], ['q', 'x', 'd', 'z'], ['p', 'k', 'k']]

result = [list((Counter(a) & Counter(b)).elements()) for a in my_list for b in sec_list]
result = [x for x in result if len(x) > 0]

print(result)

Sortie :

[['a', 'd'], ['d'], ['c', 'e'], ['x', 'q'], ['f', 'd'], ['d'], ['k', 'k', 'p']]                                                                                                                                                                                                         

Mise à jour sur la base des commentaires.

0voto

Andrej Kesely Points 20452

Sur la base des commentaires :

my_list = [["a", "d", "l"], ["c", "e", "t"], ["q", "x"], ["p", "f", "d", "k"]]
sec_list = [
    ["f", "d", "w", "a"],
    ["c", "e", "u", "h"],
    ["q", "x", "d", "z"],
    ["p", "k"],
]

# to speed up, convert the sublists to sets
tmp1 = [set(i) for i in my_list]
tmp2 = [set(i) for i in sec_list]

out = []
for s1 in tmp1:
    for s2 in tmp2:
        m = s1 & s2
        if m:
            out.append(list(m))
print(out)

Imprimés :

[['d', 'a'], ['d'], ['e', 'c'], ['x', 'q'], ['d', 'f'], ['d'], ['k', 'p']]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X