2008-12-08 17 views
6

Necesito convertir una lista (o un dict) en una lista separada por comas para pasar a otro idioma.Formatear una estructura de datos en una lista de argumentos separados por comas

¿Existe una manera más agradable de hacer esto que:

result = '' 
args = ['a', 'b', 'c', 'd'] 

i = 0 
for arg in args: 
    if i != 0: result += arg 
    else:   result += arg + ', ' 
    i += 1 

result = 'function (' + result + ') 

Gracias, Dan

+0

esto resulta en 'function (a, bcd)', si no me equivoco – hop

Respuesta

11
'function(%s)' % ', '.join(args) 

produce

'function(a, b, c, d)' 
+0

+1 para hacer formato en lugar de concatenación. –

+0

con Python 3.0 'función ({0})'. Formato (','.join (args)) – Mapad

12

', '.join(args) hará el truco.

+2

Y si los argumentos no son todas las cadenas, ',' unir (map (str, args)) funcionará muy bien. –

+1

O ',' .join (str (x) para x en args) –

+0

Gracias S. y James por el comentario adicional en esta publicación de StackOverflow. Esto es justo lo que necesitaba. – Chris

0

Por qué no utilizar un estándar que las dos lenguas pueden analizar, como JSON, XML o YAML? simplejson es útil e incluido como json en python 2.6.

1
result = 'function (%s)' % ', '.join(map(str,args)) 

recomiendo el mapa (str, args) en lugar de sólo args porque algunos de sus argumentos potencialmente no podían ser cadenas y causaría un TypeError, por ejemplo, con un argumento int en su lista:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: sequence item 0: expected string, int found 

Cuando entra en objetos dict probablemente desee separar por comas los valores del dict (presumiblemente porque los valores son los que desea pasar a esta función). Si el método de combinación en el propio objeto dict, recibirá las llaves separadas, así:

>>> d = {'d':5, 'f':6.0, 'r':"BOB"} 
>>> ','.join(d) 
'r,d,f' 

Lo que se quiere es la siguiente:

>>> d = {'d':5, 'f':6.0, 'r':"BOB"} 
>>> result = 'function (%s)' % ', '.join(map(str, d.values())) 
>>> result 
'function (BOB, 5, 6.0)' 

Nota el nuevo problema se encuentra con, sin embargo. Cuando pasa un argumento de cadena a través de la función de unión, pierde su cita. Entonces, si planea pasar cadenas, ha perdido las comillas que generalmente rodearían a la cadena cuando pasen a una función (las cadenas se citan en muchos lenguajes de propósito general). Sin embargo, si solo está pasando números, esto no es un problema para usted.

Probablemente haya una manera más agradable de resolver el problema que acabo de describir, pero este es un método que podría funcionar para usted.

>>> l = list() 
>>> for val in d.values(): 
... try: 
...  v = float(val) #half-decent way of checking if something is an int, float, boolean 
...  l.append(val) #if it was, then append the original type to the list 
... except: 
...  #wasn't a number, assume it's a string and surround with quotes 
...  l.append("\"" + val + "\"") 
... 
>>> result = 'function (%s)' % ', '.join(map(str, l)) 
>>> result 
'function ("BOB", 5, 6.0)' 

Ahora la cadena tiene comillas que la rodean. Si está pasando tipos más complejos que primitivas numéricas y cadenas, probablemente necesite una nueva pregunta :)

Una última nota: He estado usando d.values ​​() para mostrar cómo extraer los valores de un diccionario, pero de hecho, eso devolverá los valores del diccionario en un orden bastante arbitrario. Como es muy probable que su función requiera los argumentos en un orden particular, debe construir manualmente su lista de valores en lugar de llamar a d.values ​​().

+0

La mejor manera de comprobar si val es una cadena es isinstance (val, basetring) (o simplemente esinstance (val, str) en Python3.0) –

+0

¿Está Isinstance en Python 2.5.2? No puedo actualizar a 2.6 o 3.0 porque nuestra empresa depende de tantos paquetes de terceros que solo se compilan en 2.5.2 o anterior. Además, alguien una vez me dijo que el uso de isinstance puede obligar a que algo se convierta en la instancia comprobada, incluso si no lo fue. ¿Es eso cierto? –

Cuestiones relacionadas