23 votes

Associant deux élément dans une liste

Je suis de la comparaison de deux listes pour la commune de cordes et de mon code travaille actuellement à la sortie des articles en commun à partir de deux listes.

list1

['5', 'orange', '20', 'apple', '50', 'blender']

liste 2

['25', 'blender', '20', 'pear', '40', 'spatula']

Voici mon code pour l'instant:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        if item1 == item2:
            print(item1)

Ce code serait de retour blender. Ce que je veux faire maintenant, c'est aussi imprimer le numéro avant de le mixer dans chaque liste pour obtenir un résultat similaire à:

blender, 50, 25

J'ai essayé d'ajouter deux nouvelles lignes de la boucle for, mais n'a pas eu le résultat souhaité:

for item1 in list1[1::2]:
    for item2 in list2[1::2]:
        for num1 in list1[0::2]:
            for num2 in list2[0::2]:
               if item1 == item2:
                   print(item1, num1, num2)

Je sais maintenant que faire pour les boucles n'est pas la réponse. Aussi essayer d'appeler item1[-1] ne fonctionne pas. Je suis nouveau sur le Python et le besoin d'aide avec ce!

Merci

14voto

MercyDude Points 545

Vous pouvez le faire de deux façons, soit de rester avec les listes (ce Qui est plus salissant):

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
for item1 in list1[1::2]:
  for item2 in list2[1::2]:
    if item1 == item2:
       item_to_print = item1
       print(item1, ",", end="")
       for index in range(len(list1)):
           if list1[index] == item1:
               print(list1[index - 1], ",", end="")
       for index in range(len(list2)):
           if list2[index] == item1:
               print(list2[index - 1])

ou la meilleure façon (à mon avis) avec dictionnaire:

dict1 = {'apple': '20', 'blender': '50', 'orange': '5'}
dict2 = {'blender': '25', 'pear': '20', 'spatula': '40'}
for item in dict1:
   if item in dict2:
       print(item, ",", dict1[item], ",", dict2[item])

Les deux seront de sortie:

>> blender , 50 , 25

12voto

user3483203 Points 28606

Vous vous approchez de ce problème avec le mauvais Structure de Données. Vous ne devriez pas garder ces données dans les listes si vous êtes en train de faire des recherches entre les deux. Au lieu de cela, il serait beaucoup plus facile d'utiliser un dictionnaire ici.

Le programme d'installation

Vous pouvez utiliser zip à la création de ces deux dictionnaires:

a = ['5', 'orange', '20', 'apple', '50', 'blender']
b = ['25', 'blender', '20', 'pear', '40', 'spatula']

dct_a = dict(zip(a[1::2], a[::2]))
dct_b = dict(zip(b[1::2], b[::2]))

Cela vous laisse avec ces deux dictionnaires:

{'orange': '5', 'apple': '20', 'blender': '50'}
{'blender': '25', 'pear': '20', 'spatula': '40'}

Cela rend chaque partie de votre problème plus facile à résoudre. Par exemple, pour trouver les clés communs:

common = dct_a.keys() & dct_b.keys()
# {'blender'}

Et pour trouver toutes les valeurs correspondant à chaque commune de la clé:

[(k, dct_a[k], dct_b[k]) for k in common]

Sortie:

[('blender', '50', '25')]

5voto

J0hn Points 450

Je pense que vous auriez mieux adapté à l'aide de dictionnaires pour ce problème..

dict1 = {'orange': 5, 'apple': 20, 'blender': 50}
dict2 = {'blender': 25, 'pear': 20, 'spatula': 40}

donc, pour obtenir les sorties que vous souhaitez

>>dict1['blender']
50
>>dict2['blender']
25

Donc, si vous voulez obtenir le nombre de doseurs de chaque dictionnaire au format que vous voulez, vous pouvez vraiment l'utiliser

print("blender, "+str(dict1['blender'])+", "+str(dict2['blender']))

Pour aller une étape plus loin et de sortie sur la base de ce qui est dans dict1 et dict2

for i in dict1.keys(): #dict1.keys() is essentially a list with ['orange','apple','blender']
    if i in dict2.keys(): #same deal, but different items in the list
        print(str(i)+", "+str(dict1[i])+", "+str(dict2[i])) #this outputs items that are in BOTH lists
    else:
        print(str(i)+", "+str(dict1[i])) #this outputs items ONLY in dict1
for i in dict2.keys():
    if i not in dict1.keys(): #we use not since we already output the matching in the previous loop
        print(str(i)+", "+str(dict2[i])) #this outputs items ONLY in dict2

Sorties:

orange, 5
apple, 20
blender, 50, 25
pear, 20
spatula, 40

5voto

Gsk Points 2454

avec enumerate vous pouvez résoudre votre problème:

list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']



for n1, item1 in enumerate(list1[1::2]):
    for n2, item2 in enumerate(list2[1::2]):
        if item1 == item2:
            print(list1[n1*2], list2[n2*2], item1)

énumérer renvoie une tuple dont le premier élément est le nombre d'itération, le deuxième élément.
Depuis enumerate est le comptage de l'itération et que vous faites un pas de 2, nous avons besoin de multiplier par 2:
orange sera la première itération, n1 0, de sorte que la valeur précédente est à l'index 0*2
apple sera dans la deuxième itération, n1 1, de sorte que la valeur précédente est à l'index 1*2
blender sera dans la troisième itération, n1 2, de sorte que le previousl valeur est à l'index 2*2.

cela signifie que, en for n1, item1 in enumerate(list1[1::2]): n1 et item1 aurez ces valeurs:

Itération 1: n1 = 0, item1 = orange, previous_index = 0*2
Itération 2: n1 = 1, item1 = apple, previous_index = 1*2
Itération 3: n1 = 2, item1 = blender, previous_index = 2*2

en va de même pour for n2, item2 in enumerate(list2[1::2])::

Itération 1: n2 = 0, item2 = blender, previous_index = 0*2
Itération 2: n2 = 1, item2 = poire, previous_index = 1*2
Itération 3: n2 = 2, item2 = spatule, previous_index = 2*2

4voto

timgeb Points 5966

En supposant que les noms de vos listes uniques (par liste), de créer des dictionnaires de listes de votre premier.

In [1]: list1 = ['5', 'orange', '20', 'apple', '50', 'blender']
In [2]: list2 = ['25', 'blender', '20', 'pear', '40', 'spatula']
In [3]: 
In [3]: dict1 = dict(reversed(pair) for pair in zip(*[iter(list1)]*2))
In [4]: dict2 = dict(reversed(pair) for pair in zip(*[iter(list2)]*2))
In [5]: 
In [5]: dict1
Out[5]: {'apple': '20', 'blender': '50', 'orange': '5'}
In [6]: dict2
Out[6]: {'blender': '25', 'pear': '20', 'spatula': '40'}

Ce code utilise la grouper de la recette de la itertools docs.

L'appariement de deux éléments à partir de votre dictionnaires est simple comme bonjour.

In [7]: key = 'blender'
In [8]: print(key, dict1[key], dict2[key])
blender 50 25

Vous pouvez même construire un dictionnaire qui contient la commune de clés à partir d' dict1 et dict2 et une liste de valeurs.

In [12]: common = dict1.keys() & dict2
In [13]: {c:[dict1[c], dict2[c]] for c in common}
Out[13]: {'blender': ['50', '25']}

Pour un nombre arbitraire de dicts, vous pouvez résumé cette plus loin.

In [28]: from functools import reduce
In [29]: from operator import and_
In [30]: 
In [30]: dicts = (dict1, dict2)
In [31]: common = reduce(and_, map(set, dicts))
In [32]: {c:[d[c] for d in dicts] for c in common}
Out[32]: {'blender': ['50', '25']}

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