181 votes

Combinaison de deux listes et suppression des doublons, sans suppression des doublons dans la liste d'origine

J'ai deux listes que je dois combiner et dans la deuxième liste, les doublons de la première liste sont ignorés. C'est un peu difficile à expliquer, alors laissez-moi vous montrer un exemple de ce à quoi ressemble le code, et ce que je veux comme résultat.

first_list = [1, 2, 2, 5]

second_list = [2, 5, 7, 9]

# The result of combining the two lists should result in this list:
resulting_list = [1, 2, 2, 5, 7, 9]

Vous remarquerez que le résultat contient la première liste, y compris ses deux valeurs "2", mais le fait que la deuxième liste ait également une valeur supplémentaire de 2 et 5 n'est pas ajouté à la première liste.

Normalement, pour quelque chose comme ça, j'utiliserais des sets, mais un set sur first_list purgerait les valeurs dupliquées qu'il a déjà. Je me demande donc quel est le moyen le plus rapide et le plus efficace pour obtenir la combinaison souhaitée.

Merci.

12voto

Rafiq Points 136

Pour moi, la solution la plus simple est la suivante :

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

merged_list = list(set(first_list+second_list))
print(merged_list)

#prints [1, 2, 5, 7, 9]

8voto

Daniel Roseman Points 199743
resulting_list = first_list + [i for i in second_list if i not in first_list]

4voto

z0r Points 470

Vous pouvez également combiner les réponses de RichieHindle et de Ned Batchelder pour obtenir une cas moyen O(m+n) algorithme qui préserve l'ordre :

first_list = [1, 2, 2, 5]
second_list = [2, 5, 7, 9]

fs = set(first_list)
resulting_list = first_list + [x for x in second_list if x not in fs]

assert(resulting_list == [1, 2, 2, 5, 7, 9])

Il convient de noter que x in s a une complexité dans le pire des cas de O(m) , de sorte que le cas le plus défavorable La complexité de ce code est encore O(m*n) .

2voto

B. Mohammad Points 30

Vous pouvez utiliser dict.fromkeys pour obtenir une liste sans doublons :

def mergeTwoListNoDuplicates(list1, list2):
    """
    Merges two lists together without duplicates
    :param list1:
    :param list2:
    :return:
    """
    merged_list = list1 + list2
    merged_list = list(dict.fromkeys(merged_list))
    return merged_list

1voto

Alon Points 701

Sur la base de la recette :

result_list = list(set().union(first_list, second_list))

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