2012-04-30 8 views
8

Uno puede crear diccionarios utilizando generadores (PEP-289):Cómo agregar pares clave-valor adicionales a un dict() construido con un argumento de generador?

dict((h,h*2) for h in range(5)) 
#{0: 0, 1: 2, 2: 4, 3: 6, 4: 8} 

¿Es sintácticamente posible añadir algunos pares de valores clave adicionales en la misma dict() llaman? La siguiente sintaxis es incorrecta pero mejor explica mi pregunta:

dict((h,h*2) for h in range(5), {'foo':'bar'}) 
#SyntaxError: Generator expression must be parenthesized if not sole argument 

En otras palabras, ¿es posible construir la siguiente en una sola dict() llamada:

{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 'foo': 'bar' } 

Respuesta

16

Constructor:

dict(iterableOfKeyValuePairs, **dictOfKeyValuePairs) 

Ejemplo:

>>> dict(((h,h*2) for h in range(5)), foo='foo', **{'bar':'bar'}) 
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8, 'foo': 'foo', 'bar': 'bar'} 

(Tenga en cuenta que tendrá que poner entre paréntesis las expresiones generadoras si no el único argumento.)

+1

+1, completa ya la vez breve. Bien hecho. –

+1

+1, Aquí vienen nuestros amigos * arg ** kwargs otra vez – Boud

+0

¡Eso es todo! ¡Muchas gracias! – tnajdek

0

Usted podría utilizar itertools.chain (ver Concatenate generator and item) para agregar sus cosas adicionales a su llamada al dict().

Probablemente sea más fácil hacerlo de la manera más fácil: una llamada a dict y luego agregue los elementos adicionales explícitamente.

1
dict([(h,h*2) for h in range(5)] + [(h,h2) for h,h2 in {'foo':'bar'}.items()]) 
Cuestiones relacionadas