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']
4 Réponses :
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] + ')' ;
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']
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)}
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:
ziprenvoie 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.
Les deux listes ont-elles la même longueur? Et votre résultat ne ressemble pas à un dictionnaire.