Форматирование структуры данных в список аргументов через запятую - PullRequest
6 голосов
/ 08 декабря 2008

Мне нужно преобразовать список (или дикт) в список через запятую для перехода на другой язык.

Есть ли лучший способ сделать это, чем:

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

Спасибо, Dan

Ответы [ 4 ]

12 голосов
/ 08 декабря 2008

', '.join(args) добьется цели.

11 голосов
/ 08 декабря 2008
'function(%s)' % ', '.join(args)

производит

'function(a, b, c, d)'
1 голос
/ 09 декабря 2008
result = 'function (%s)' % ', '.join(map(str,args))

Я рекомендую карту (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 запятыми (предположительно потому, что значения - это то, что вы хотите передать в эту функцию). Если вы примените метод join к самому объекту dict, ключи будут разделены следующим образом:

>>> 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 ​​().

0 голосов
/ 08 декабря 2008

Почему бы не использовать стандарт, который могут анализировать оба языка, например, JSON, XML или YAML? simplejson удобен и включен как json в python 2.6.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...