Tengo un diccionario de la siguiente manera:-

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

Para convertirlo en una separada por comas claves de la cadena de key_string y valores separados por comas en la cadena de val_string hago lo siguiente:-

key_list=[]
val_list=[]

 for key,value in dict.iteritems():
     key_list.append(key)
     val_list.append(value)

 key_string = ','.join(key_list)
 val_string = ','.join(val_list)

El resultado es

 key_string = "a,b,c"
 val_string = "1,2,3" 

Hay una más eficiente y elegante manera de hacer esto?

  • ¿Desea «eficiente» o «elegante»? Los dos son a menudo con propósitos cruzados. Y qué quieres decir con «eficiente» como en «menos tiempo» o «menos espacio temporal» o alguna otra medida?
  • Si yo te digo que val_string = ','.join(dict.values()), estoy seguro de que usted puede trabajar el otro…
  • Algo como esto? ‘,’.únete a(map(lambda x:str(x), [1,2]))
  • Se espera que las claves/valores en cualquier orden en particular?
  • Que no hacer la separación de claves y valores. Y lambda x: str(x) es sólo una manera más lenta y menos elegante que quiero escribir str. Y no es necesario de todos modos, dado que todas sus claves y valores ya están las cadenas.
  • Específicos de pedido no es necesaria la medida en que está ordenado con respecto a cada uno de los otros

4 Comentarios

  1. 8

    Uso str.join(iterable) (Sugerencia: no nombre de su dict dict):

    d = {'a':'1', 'b':'2', 'c':'3'}
    print(",".join(d.keys()))
    print(",".join(d.values()))

    De salida:

    c,a,b
    3,1,2

    Tenga en cuenta que un diccionario no tiene fin. Por lo que la salida no tiene ningún pedido usted puede confiar en, demasiado.

  2. 6

    La solución obvia es utilizar únicamente iterkeys y itervalues en lugar de iteritems:

    key_string = ','.join(d.iterkeys())
    val_string = ','.join(d.itervalues())

    Si usted está preocupado acerca de las claves y valores de la muestra en los diferentes órdenes, mientras que los de Python permite dicts a recorrer en el orden que quieran, no hace documento aquí que si repetir una y otra vez sin hacer nada entre usted va a obtener el mismo orden:

    Si items(), keys(), values(), iteritems(), iterkeys(), y itervalues() son llamados sin que exista modificaciones en el diccionario, las listas se corresponden directamente.

    (El 2.7 docs nunca se actualizaron para decirlo, pero es cierto también para viewitems, viewkeys, y viewvalues.)


    Al menos en CPython, es probable que sea un poco más eficiente el uso de keys y values en lugar de iterkeys y itervalues (porque, cuando se les da un iterador, el CPython implementación de str.join sólo hace una lista fuera de él), pero dudo que importa. Como Padraic Cunningham señala en los comentarios, por las teclas (pero no de los valores), usted puede ser capaz de obtener la misma lista aún más rápido con sólo list(d) en lugar de d.keys() (aunque tal vez no—evita un LOAD_ATTR llamada, pero al costo de una LOAD_NAME, a menos que haya primero copian list a un local, por lo que puede ser LOAD_FASTed).


    Por último, si quieres hacerlo con iteritems (digamos que usted está usando un roto, no del todo compatible con intérprete de Python que aleatoriza la iteración fin de cada vez), puede utilizar zip para que:

    keys, values = zip(*d.iteritems())

    Que convierte una secuencia de pares en un par de secuencias.

    • Usted sólo podríamos llamar «».join() en d sin la llamada .iterkeys aunque como ya se ha dicho algo así como list(d) sería más eficiente, también en python 3 diferentes carreras de la secuencia de comandos puede cambiar el orden de las claves y valores que es un comportamiento diferente a python 2.
    • Sí, supongo ','.join(list(d)) sería probablemente la más eficiente en CPython 2.7. Si alguien realmente le importa, me gustaría probar todas las posibilidades, pero dudo que alguien lo hace. En cualquier caso, por el paralelismo con el itervalues(), creo que iterkeys() es más fácil de leer aquí.
    • Como para el orden entre las pistas, en realidad, Python tiene definitivamente nunca se garantiza que obtendrá el mismo orden en cada carrera. 2.7 y 3.4 tienen casi idéntica redacción de la orden. Es cierto que CPython 3.4 utiliza el hash de la aleatorización para las cadenas por defecto, mientras que el 2,7 (y 3.3) no, pero luego Jython 2.5 ya darle un orden diferente en cada ejecución, y mientras tanto, se habla de tener dict preservar el orden de inserción por defecto en CPython 3.5 (y tal vez incluso que lo requieran para otras implementaciones), por lo que no es realmente un Python 2 vs Python 3 cosa.
    • Siempre he pensado que en cpython 2.7 que al menos para las cadenas y enteros obtendría siempre el mismo orden a través de diferentes pistas.
    • Sí, pero eso es algo específico de la implementación, no 2.x-vs-3.x diferencia. CPython 1.0-3.3 se comportan de una manera, CPython 3.4 se comporta de una manera diferente, CPython 3.5 podrían comportarse de una manera diferente, Jython 2.2-2.5 se comportan de una manera diferente, yo no sé acerca de IronPython o Skulpt o etc. Usted no debe asumir que «Python 2» significa «mismo orden a lo largo de pistas», o que «Python 3» significa «aleatoria».
    • Además, el OP dijo específicamente «Específicos de pedido no es necesaria la medida en que está ordenado con respecto a cada uno de los otros», y Python 2.x y 3.x tanto para garantizar que mucho (y explícitamente no más que eso) en la sección he enlazado.

  3. 1

    Que usted podría hacer algo como esto:

    key_string = ','.join(dict.keys()) 
    val_string = ','.join(dict.values())
  4. 0

    Utilizando la misma función str.join(iterable), si el diccionario de valores no son todas las cadenas, a continuación, utilizando lista de comprensión de la taquigrafía:

    d = {'a': '1', 'b': 2, 'c': {'d': 3}, 'e': [4,5,6]}
    print(",".join(d.keys()))
    print(",".join([str(e) for e in d.values()]))

    De salida:

    a,b,c,e
    1,2,{'d': 3},[4, 5, 6]

    Si quieres personalizar el formato, a continuación, este se convierte en un elegante abstracción. Reemplazar str(e) con el formateador personalizado myFormatter(e).

    • He publicado esta solución porque tengo excepción de mi diccionario: TypeError: sequence item 1: expected str instance, int found

Dejar respuesta

Please enter your comment!
Please enter your name here