1
votes

Créer un dictionnaire à partir de 2 listes

J'ai deux listes suivantes:

result = [17-Q2: 1(1.00), 17-Q3: 2(2.00), 17-Q4: 5(5.00), 18-Q1: 6(6.00)]

Je veux un dictionnaire de la manière suivante. Puis-je faire cela en Python?

list1 = ['17-Q2', '1.00', '17-Q3', '2.00', '17-Q4', '5.00', '18-Q1', '6.00']
list2 = ['17-Q2', '1', '17-Q3', '2', '17-Q4', '5', '18-Q1', '6']


1 commentaires

Les deux listes ont-elles la même longueur? Et votre résultat ne ressemble pas à un dictionnaire.


4 Réponses :


1
votes

Voici une approche:

result = {}
list1=['17-Q2', '1.00', '17-Q3', '2.00', '17-Q4', '5.00', '18-Q1', '6.00']
list2=['17-Q2', '1', '17-Q3', '2', '17-Q4', '5', '18-Q1', '6']

for i in range(0, len(list1)-1, 2):
    result[list1[i]] = list2[i + 1] + '(' + list1[i+1] + ')' ;


0 commentaires

0
votes

En supposant que votre entrée soit la suivante:

from collections import OrderedDict
final_dict = dict()
i = 0 # Initializing the counter

while (i<len(list1)):
      # Updating the final dict
      final_dict.update({list1[i]:str(list2[i+1]) + "(" + str(list1[i+1]) + ")"})
      i += 2 # Incrementing by two in order to land on the alternative index

# If u want sorted dictionary
sorted_dict = OrderedDict(sorted(final_dict.items()))
print (sorted_dict)

Et la sortie souhaitée comme suit:

result = {17-Q2: 1(1.00), 17-Q3: 2(2.00), 17-Q4: 5(5.00), 18-Q1: 6(6.00)}

Code suivant avec un seul La boucle while pourrait aider:

list1 = ['17-Q2', '1.00', '17-Q3', '2.00', '17-Q4', '5.00', '18-Q1', '6.00']
list2 = ['17-Q2', '1', '17-Q3', '2', '17-Q4', '5', '18-Q1', '6']


0 commentaires

0
votes

Vous pouvez compresser les deux listes, puis compresser l'itérable résultant avec lui-même afin que vous puissiez l'itérer par paires pour construire le dict souhaité:

{'17-Q2': '1(1.00)', '17-Q3': '2(2.00)', '17-Q4': '5(5.00)', '18-Q1': '6(6.00)'}

résultat devient:

i = zip(list1, list2)
result = {k: '%s(%s)' % (v2, v1) for (k, _), (v1, v2) in zip(i, i)}


0 commentaires

0
votes

Vous pouvez utiliser zip et dict .

from itertools import zip_longest

keys = ["a", "b", "c", "d"]
values = ["A", "B", "C"]

print(dict(zip_longest(keys, values)))
# prints: {'a': 'A', 'b': 'B', 'c': 'C', 'd': None}

Cela fonctionne car dict peut prendre une liste (ou n'importe quel itérateur) de tuples de (clé, valeur) à créer. La fonction zip permet de construire des tuples à partir de listes:

zip renvoie un itérateur de tuples, où le i-ème tuple contient le i-ème élément de chacune des séquences d'arguments ou des itérables.

Notez que cela ne renverra qu'un dictionnaire qui associe la liste la plus courte (soit clés ou valeur ) avec l'élément correspondant.

Si vous souhaitez avoir une valeur par défaut pour les éléments non appariés, vous pouvez toujours utiliser itertools.zip_longest

keys = ["a", "b", "c", "d"]
values = ["A", "B", "C"]

print(dict(zip(keys, values)))
# prints: {'a': 'A', 'b': 'B', 'c': 'C'}

Vous pouvez également utiliser le paramètre de mot-clé zip_longest fillvalue pour avoir autre chose que None lorsque la valeur correspondante n'est pas trouvée.

D'un autre côté, si vous avez plus de valeurs que de clés, ceci Cela n'aurait pas beaucoup de sens car vous effaceriez la clé par défaut (à savoir fillvalue ) pour chaque élément manquant.


0 commentaires