Duplicate possible:
Comment puis-je convertir un dictionnaire Python en une liste de n-uplets?
J'essaie de convertir un dictionnaire Python en une liste Python, afin d'effectuer certains calculs.
#My dictionary
dict = {}
dict['Capital']="London"
dict['Food']="Fish&Chips"
dict['2012']="Olympics"
#lists
temp = []
dictList = []
#My attempt:
for key, value in dict.iteritems():
aKey = key
aValue = value
temp.append(aKey)
temp.append(aValue)
dictList.append(temp)
aKey = ""
aValue = ""
C'est ma tentative ... mais je ne peux pas comprendre ce qui ne va pas?
Votre problème est que vous avez key
et value
entre guillemets pour en faire des chaînes, c'est-à-dire que vous définissez aKey
pour qu'il contienne la chaîne "key"
et non la valeur de la variable key
. En outre, vous n'effacez pas la liste temp
, vous y ajoutez donc à chaque fois, au lieu de ne contenir que deux éléments.
Pour corriger votre code, essayez quelque chose comme:
for key, value in dict.iteritems():
temp = [key,value]
dictlist.append(temp)
Il n'est pas nécessaire de copier les variables de boucle key
et value
dans une autre variable avant de les utiliser. Je les ai donc abandonnées. De même, vous n'avez pas besoin d'utiliser append pour construire une liste, vous pouvez simplement la spécifier entre crochets, comme indiqué ci-dessus. Et nous aurions pu faire dictlist.append([key,value])
si nous voulions être aussi brefs que possible.
Ou utilisez simplement dict.items()
comme cela a été suggéré.
dict.items()
Fait le tour.
La conversion de dict en liste est facilitée en Python. Trois exemples:
>> d = {'a': 'Arthur', 'b': 'Belling'}
>> d.items()
[('a', 'Arthur'), ('b', 'Belling')]
>> d.keys()
['a', 'b']
>> d.values()
['Arthur', 'Belling']
Vous devriez utiliser dict.items()
.
Voici une solution one-liner pour votre problème:
[(k,v) for k,v in dict.items()]
et résultat:
[('Food', 'Fish&Chips'), ('2012', 'Olympics'), ('Capital', 'London')]
ou tu peux faire
l=[]
[l.extend([k,v]) for k,v in dict.items()]
pour:
['Food', 'Fish&Chips', '2012', 'Olympics', 'Capital', 'London']
>>> a = {'foo': 'bar', 'baz': 'quux', 'hello': 'world'}
>>> list(reduce(lambda x, y: x + y, a.items()))
['foo', 'bar', 'baz', 'quux', 'hello', 'world']
Pour expliquer: a.items () retourne une liste de n-uplets. Ajouter deux n-uplets ensemble fait un tuple contenant tous les éléments. Ainsi, la réduction crée un tuple contenant toutes les clés et toutes les valeurs, puis la liste (...) en fait une liste.
Vous voulez probablement juste ceci:
dictList = dict.items()
Votre approche a deux problèmes. Pour l'un, vous utilisez key
et value
entre guillemets, qui sont des chaînes avec les lettres "clé" et "valeur", non liées aux variables de ce nom. En outre, vous continuez à ajouter des éléments à la liste "temporaire" et à ne jamais vous débarrasser des anciens éléments qui y figurent déjà lors d'itérations précédentes. Assurez-vous que vous avez une nouvelle liste vide temp
à chaque itération et utilisez les variables key
et value
:
for key, value in dict.iteritems():
temp = []
aKey = key
aValue = value
temp.append(aKey)
temp.append(aValue)
dictList.append(temp)
Notez également que ceci pourrait être écrit plus court sans les variables temporaires (et dans Python 3 avec items()
au lieu de iteritems()
):
for key, value in dict.items():
dictList.append([key, value])
Si vous créez un dictionnaire uniquement pour dresser une liste de n-uplets, il peut être difficile de créer des dict comme vous êtes, utilisez Zip ().
C'est particulièrement utile si vous avez un en-tête et plusieurs lignes. Par exemple, si je suppose que vous voulez les statistiques olympiques pour les pays:
headers = ['Capital', 'Food', 'Year']
countries = [
['London', 'Fish & Chips', '2012'],
['Beijing', 'Noodles', '2008'],
]
for olympics in countries:
print Zip(headers, olympics)
donne
[('Capital', 'London'), ('Food', 'Fish & Chips'), ('Year', '2012')]
[('Capital', 'Beijing'), ('Food', 'Noodles'), ('Year', '2008')]
Je ne sais pas si c’est l’objectif final et que je sois hors de propos, mais cela pourrait être quelque chose à garder à l’esprit.