1
votes

python: comparaison des valeurs dans une liste si elles existent dans une autre liste

Alors maintenant, j'ai 2 listes,

for x in range(len(list1)):
    for y in range(1, len(list2)+1):
        if(list1[x][1] == list2[y]):
            result = [y, list2[y][0]]
            fstore.append(result)

Je veux comparer le tout 2ème élément de list1 et s'il existe dans list2, imprimer la liste correspondante. donc le résultat que je veux est quelque chose comme ceci:

[[1, 'miniwok'],[2, 'chicken'],[10,'pizza']]

J'ai essayé d'utiliser la boucle for imbriquée mais je pense que je fais quelque chose de mal

list1 = [[0,1],[0,2],[0,10]]
list2 = [[1, ['miniwok', 'food1']], [2,['chicken', 'food2']], [3,['duck', 'food3']], ..... , [10, ['pizza', 'food10']]]


1 commentaires

Est-il possible de modifier le code qui génère ces listes pour utiliser des dictionnaires, qui seront à la fois plus performants (accédant à l'élément "aléatoire" avec O (1)), et plus simple à utiliser? Cela suppose que vos clés (2e entiers) sont uniques.


3 Réponses :


2
votes

Vous pouvez convertir list2 en dictionnaire pour une recherche plus rapide:

[[1, 'miniwok'], [2, 'chicken'], [10, 'pizza']]

Résultat:

list1 = [[0,1],[0,2],[0,10]]
list2 = [[1, ['miniwok', 'food1']], [2,['chicken', 'food2']], [3,['duck', 'food3']], [10, ['pizza', 'food10']]]
new_l2 = dict(list2)
result = [[b, k[a]] for a, b in list1 if (k := new_l2.get(b)) is not None]


1 commentaires

Il convient de mentionner que l'opérateur : = est nouveau depuis python 3.8 .



0
votes

Vous pouvez faire:

list1 = [[0,1],[0,2],[0,10]]
list2 = [[1, ['miniwok', 'food1']], [2,['chicken', 'food2']], [3,['duck', 'food3']],... , [10, ['pizza', 'food10']]]
numbers = [number[1] for number in list1]
[(item[0], item[1][0]) for item in list2 if item[0] in numbers]

Sortie:

[(1, 'miniwok'), (2, 'chicken'), (10, 'pizza')]

Bien sûr, le "()" dans la compréhension de liste qui crée une liste de tuples peut être changé avec "[]" pour créer une liste de listes, si préférez.


0 commentaires

1
votes

Votre code a rencontré des problèmes pour accéder aux valeurs via l'indexation et vous n'avez pas attribué à fstore une liste vide avant de l'utiliser.

La version corrigée de votre réponse est ici-

[[1, 'miniwok'], [2, 'chicken'], [10, 'pizza']]


0 commentaires