将数据结构格式化为以逗号分隔的参数列表

时间:2008-12-08 11:00:40

标签: python refactoring list

我需要将列表(或dict)转换为以逗号分隔的列表,以便传递给另一种语言。

有没有比这更好的方法:

 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 + ')

谢谢, 丹

4 个答案:

答案 0 :(得分:12)

', '.join(args)可以解决问题。

答案 1 :(得分:11)

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

产生

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

答案 2 :(得分:1)

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

我建议使用map(str,args)而不仅仅是args,因为你的某些参数可能不是字符串,并且会导致TypeError,例如,列表中带有int参数:

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

当你进入dict对象时,你可能想要用逗号分隔dict的值(大概是因为值是你想要传递给这个函数的值)。如果对dict对象本身执行join方法,则会将键分开,如下所示:

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

您想要的是以下内容:

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

请注意您遇到的新问题。当您通过join函数传递字符串参数时,它会丢失其引用。因此,如果您计划传递字符串,则在传递给函数时,您丢失了通常围绕字符串的引号(字符串在许多通用语言中引用)。但是,如果你只传递数字,这对你来说不是问题。

可能有一种更好的方法来解决我刚才描述的问题,但这里有一种方法可以帮助你。

>>> 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)'

现在字符串有自己的引号。如果您传递的数据类型比数字原语和字符串更复杂,那么您可能需要一个新问题:)

最后一点:我一直在使用d.values()来展示如何从字典中提取值,但实际上它将以非常随意的顺序从字典中返回值。由于您的函数很可能需要特定顺序的参数,因此您应手动构造值列表,而不是调用d.values()。

答案 3 :(得分:0)

为什么不使用两种语言都可以解析的标准,如JSON,XML或YAML? simplejson很方便,在python 2.6中包含为json。