web-dev-qa-db-fra.com

Conversion de dictionnaire en liste?

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?

169
Federer

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é.

130
Dave Webb
dict.items()

Fait le tour.

385
Björn

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']
170
Akseli Palén

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']
49
Shay
 >>> 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.

31
Martin DeMello

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])
20
sth

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.

5
Morgan