Si tengo un diccionario como:

{ 'a': 1, 'b': 2, 'c': 3 }

¿Cómo puedo convertir de esto?

[ ('a', 1), ('b', 2), ('c', 3) ]

Y ¿cómo puedo convertir de esto?

[ (1, 'a'), (2, 'b'), (3, 'c') ]
  • [tuple(reversed(x)) for x in d.items()]
  • Dado x ya es un tuple en el código (es la naturaleza de items para producir un iterable de tuples), sería más sencillo y más rápido que acaba de hacer [x[::-1] for x in d.items()]; la reversión de la rebanada directamente construye una inversión de tuple del tamaño adecuado en lugar de tener el tuple constructor de forma iterativa rellenar (con sobreasignación y de cambio de tamaño en la final) una tuple de un reversed iterador.
  • estás en lo correcto. Yo sólo quería ser explícito de que no es siempre una necesidad para k, v patrón en tales casos.
  • Nota: añadido compatibility etiqueta porque de py2.x // py3.x diferencias
InformationsquelleAutor mike | 2009-03-23

10 Comentarios

  1. 334
    >>> d = { 'a': 1, 'b': 2, 'c': 3 }
    >>> d.items()
    [('a', 1), ('c', 3), ('b', 2)]
    >>> [(v, k) for k, v in d.iteritems()]
    [(1, 'a'), (3, 'c'), (2, 'b')]

    No en el orden que desee, pero dicts no tienen un orden específico, de todos modos.1 Ordenar u organizar lo necesario.

    Ver: los elementos(), iteritems()


    En Python 3.x, no se usan iteritems (que ya no existe), pero en lugar de utilizar items, que ahora devuelve un «ver» en el diccionario de elementos. Ver el Qué hay de Nuevo documento para Python 3.0, y el nuevo documentación de las vistas.

    1: la Inserción de la orden de preservación para dicts fue añadido en Python 3.7

    • los elementos() devuelve un dict_keys ver en python3. Envolver esta llamada con un elenco de una lista en la lista de» ()». Ver a @SilentGhost la respuesta
  2. 46

    ya que nadie más lo hizo, voy a añadir py3k versiones:

    >>> d = { 'a': 1, 'b': 2, 'c': 3 }
    >>> list(d.items())
    [('a', 1), ('c', 3), ('b', 2)]
    >>> [(v, k) for k, v in d.items()]
    [(1, 'a'), (3, 'c'), (2, 'b')]
  3. 9

    Crear una lista de namedtuples

    A menudo puede ser muy útil para el uso de namedtuple. Por ejemplo, usted tiene un diccionario de ‘nombre’ como las llaves y el ‘score’ como valores como:

    d = {'John':5, 'Alex':10, 'Richard': 7}

    Puede hacer una lista de los elementos como tuplas ordenadas si te gusta, y obtener el nombre y la puntuación de, digamos que el jugador con la puntuación más alta (índice=0) muy Pythonically como este:

    >>> player = best[0]
    
    >>> player.name
            'Alex'
    >>> player.score
             10

    De cómo hacerlo:

    lista en orden aleatorio o mantener el orden de las colecciones.OrderedDict:

    import collections
    Player = collections.namedtuple('Player', 'name score')
    players = list(Player(*item) for item in d.items())

    en fin, ordenados por valor de (‘score’):

    import collections
    Player = collections.namedtuple('Player', 'score name')

    ordenados con la puntuación más baja primero:

    worst = sorted(Player(v,k) for (k,v) in d.items())

    ordenados con mayor puntuación en primer lugar:

    best = sorted([Player(v,k) for (k,v) in d.items()], reverse=True)
  4. 6

    Lo que quieres es dict‘s items() y iteritems() métodos. items devuelve una lista de (clave,valor) tuplas. Desde las tuplas son inmutables, que no puede ser revertido. Por lo tanto, usted tiene que iterar los elementos y crear nuevas tuplas para obtener la inversa de (valor,clave) tuplas. Para la iteración, iteritems es preferible ya que se utiliza un generador para producir la (clave,valor) tuplas en lugar de tener que mantener a toda la lista en la memoria.

    Python 2.5.1 (r251:54863, Jan 13 2009, 10:26:13) 
    [GCC 4.0.1 (Apple Inc. build 5465)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> a = { 'a': 1, 'b': 2, 'c': 3 }
    >>> a.items()
    [('a', 1), ('c', 3), ('b', 2)]
    >>> [(v,k) for (k,v) in a.iteritems()]
    [(1, 'a'), (3, 'c'), (2, 'b')]
    >>> 
  5. 5
    [(k,v) for (k,v) in d.iteritems()]

    y

    [(v,k) for (k,v) in d.iteritems()]
    • «[(k,v) for (k,v) en d.iteritems()]» es una terrible equivalente a d.los elementos()
  6. 4
    >>> a={ 'a': 1, 'b': 2, 'c': 3 } 
    
    >>> [(x, [x]) para x en una.las teclas() ] 
    [('a', 1), ('c', 3), ('b', 2)] 
    
    >>> [(a[x],x) para x en una.las teclas() ] 
    [(1, 'a'), (3, 'c'), (2, 'b')] 
    
  7. 4

    Por keys() y values() métodos de diccionario y zip.

    zip devuelve una lista de tuplas que actúa como un orden de diccionario.

    Demo:

    >>> d = { 'a': 1, 'b': 2, 'c': 3 }
    >>> zip(d.keys(), d.values())
    [('a', 1), ('c', 3), ('b', 2)]
    >>> zip(d.values(), d.keys())
    [(1, 'a'), (3, 'c'), (2, 'b')]
    • Esto funcionó para mí como una alternativa a la collections.OrderedDict() que funciona mejor con varias versiones de Python Solicitudes HTTP lib. Aunque no me gusta el zip nombre de la función como algo vago o sobrecargado.
    • Nota el zip-ification no es un «profundo» de fundición, es decir, si hay anidada de los niños, no serán afectados. Usted podría tener que rodar su propia recursividad.
  8. 3
    d = {'John':5, 'Alex':10, 'Richard': 7}
    list = []
    for i in d:
       k = (i,d[i])
       list.append(k)
    
    print list
    • Aunque este código puede ayudar a resolver el problema, no explica porque y/o como contesta a la pregunta. La prestación de este contexto adicional mejorará con el tiempo su valor educativo. Por favor, editar su respuesta a agregar explicación, incluyendo lo que las limitaciones y supuestos que se aplican.
  9. 3

    Para Python3.x uso

    for key, value in dict.items():
        temp = [key,value]
        dictlist.append(temp)

    Para Python 2.7 uso

    for key, value in dict.iteritems():
        temp = [key,value]
        dictlist.append(temp)

    Gracias

Dejar respuesta

Please enter your comment!
Please enter your name here