Преобразование списков кортежей в строки Python - PullRequest
14 голосов
/ 26 ноября 2010

Я написал в Python функцию, которая возвращает список, например

[(1,1),(2,2),(3,3)] 

Но я хочу вывод в виде строки, чтобы я мог заменить запятую на другой символ, чтобы вывод был

'1@1' '2@2' '3@3' 

Есть ли простой способ обойти это? :) Спасибо за любые советы заранее

Ответы [ 9 ]

18 голосов
/ 26 ноября 2010

Это выглядит как list из tuple с, где каждый tuple имеет два элемента.

' '.join(['%d@%d' % (t[0],t[1]) for t in l])

Что, конечно, можно упростить до:

' '.join(['%d@%d' % t for t in l])

Или даже:

' '.join(map(lambda t: '%d@%d' % t, l))

Где l - ваш оригинал list.Это генерирует пары «число @ число» для каждого кортежа в списке.Затем эти пары соединяются пробелами (' ').

Синтаксис join показался мне немного странным, когда я впервые начал работать с Python, но документация была огромнойпомощь.

4 голосов
/ 26 ноября 2010

Вы можете преобразовать кортежи в строки, используя оператор% с пониманием списка или генератором, например,

ll = [(1,1), (2,2), (3,3)]
['%d@%d' % aa for aa in ll]

Это вернет список строк, например:

['1@1', '2@2', '3@3']

Вы можете объединить полученный список строк вместе для вывода. Эта статья описывает полдюжины различных подходов с эталонными тестами и анализом их относительных преимуществ.

3 голосов
/ 26 ноября 2010

' '.join([str(a)+"@"+str(b) for (a,b) in [(1,1),(2,2),(3,3)]])

или для произвольных кортежей в списке,

' '.join(['@'.join([str(v) for v in k]) for k in [(1,1),(2,2),(3,3)]])

2 голосов
/ 26 ноября 2010
In [1]: ' '.join('%d@%d' % (el[0], el[1]) for el in [(1,1),(2,2),(3,3)])
Out[1]: '1@1 2@2 3@3'
1 голос
/ 26 ноября 2010
[ str(e[0]) + ',' + str(e[1]) for e in [(1,1), (2,2), (3,3)] ]

Это если вы хотите, чтобы они были в коллекции строк, я не понял, хотите ли вы одну выходную строку или коллекцию.

0 голосов
/ 16 ноября 2013

вы можете использовать функцию repr и затем просто заменить биты строки:

>>> original = [(1,1),(2,2),(3,3)]
>>> intermediate = repr(original)
>>> print intermediate
[(1, 1), (2, 2), (3, 3)]
>>> final = intermediate.replace('), (', ' ').replace('[(','').replace(')]','').replace(', ','@')
>>> print final
1@1 2@2 3@3

, но это будет работать, только если вы точно знаете, что ни один из кортежей не имеетследующие последовательности символов, которые должны быть сохранены в конечном результате: ), (, [(, )], ,

0 голосов
/ 15 июля 2013

Вам нужно только join и str для понимания генератора.

0 голосов
/ 26 ноября 2010
" ".join(map(lambda el:"%d@%d" % el, [(1,1), (2,2), (3,3)]))
0 голосов
/ 26 ноября 2010
[str(item).replace(',','@') for item in [(1,1),(2,2),(3,3)]]
...