2013-12-11 3 views
0

У меня есть список кортежей, который выглядит примерно так:Как преобразовать кортеж с несколькими элементами в строку

list = [('spam', 9), ('the', 7), ('in', 6), ('my', 6), ('by', 5), ('and', 4)] 

Я хочу, чтобы превратить каждый кортеж в строку. У меня есть код, который не работает ...

for tup in list: 
    tup = str(tup) 
    print(tup) 

и я немного потерял. В приведенном выше коде просто печатается тот же список, с которого я начал работать. Может ли кто-нибудь помочь мне, пожалуйста? Я новичок в python и программировании в целом, поэтому я сожалею, если это вопрос о noob.

+1

Что именно вы хотите/ожидать? Строковое представление кортежа по умолчанию выглядит так же, как и код python, который его создал. –

+0

'print (tup)' делает то же самое, что и 'str (tup)' и 'repr (tup)'. Какой результат вы ожидаете? –

+2

Вы не должны использовать переменные типа 'list', которые являются именами встроенных модулей, - вы можете получить неожиданное поведение позже! – darthbith

ответ

1

Вы ищете что-то вроде этого?

for tup in my_list: 
    tup = ' '.join(map(str,tup)) 
    print(tup) 

Edit - просто объясняю немного:
' '.join(...) - это строковый метод .join, она нуждается в соединяющую строку (' ' здесь) и итератор в качестве аргумента. Итерируемый содержит строки.
map(str,tup) - функция map() принимает имя функции (в данном случае str) и выполняет итерацию и применяет эту функцию ко всем членам итерации. Таким образом, он превратит кортеж в список строк, готовый к использованию метода .join. Это эквивалентно пониманию списка [str(i) for i in tup].
Таким образом, вы также можете сделать tup = ' '.join(str(i) for i in tup)

+2

Я сомневаюсь, что 'spam9' - это тот результат, который он хочет либо ... но, возможно, этого достаточно, чтобы показать ему, что он должен _decide_, что он хочет, прежде чем кто-либо сможет написать код, который дает его ему ... – abarnert

+0

Я помещал пробел в строку, на по крайней мере, теперь это 'спам 9'! :) – Roberto

1

Вы можете попробовать использовать str.join() объединиться элементы каждого кортежа. Затем вам потребуется перебрать содержимое списка и поместить каждый элемент в функцию str.join().

3

Вы делаете именно то, что, по вашему мнению, хотите: превращая каждый кортеж в строку.

Проблема заключается в том, что представление строки по умолчанию (на самом деле, как человек дружественного str и программист дружественного repr) выглядит точно так же, как исходный код: преобразование ('spam', 9) в строку дает строку "('spam', 9)".

Если вы хотите что-то другое, вы можете это сделать. Но вы должны решить, что хотите, прежде чем писать код для него. Тогда это просто вопрос использования форматирования строк или конкатенации или join.

Например, предположим, что вы хотите, чтобы распечатать это:

spam: 9 
the: 7 
in: 6 
… 

Тогда вы можете сделать это:

for tup in list: 
    tup = '{}: {}'.format(*tup) 
    print(tup) 

Или, если вы хотите это:

You have 9 copies of "spam". 
You have 7 copies of "the". 
… 

Тогда это:

for tup in list: 
    tup = 'You have {1} copies of "{0}"'.format(*tup) 
    print(tup) 

И так далее.

+1

Другая возможность: только напечатать * один * элемент из кортежа (возможно, строковое значение). –

+0

@MartijnPieters: или, может быть, напечатайте 'спам' 9 раз, затем' the' 7 раз и т. Д.? – abarnert

+0

Множество возможностей на этом этапе ... даже печатать строки в [1] числовом порядке, например «и по моему в спаме» ... heheh ... – Roberto

1

В качестве альтернативы однострочный. (Как дополнение к более сложным ответам!):

>>> '; '.join(map(lambda tpl: '%s: %s' % tpl, list)) 
'spam: 9; the: 7; in: 6; my: 6; by: 5; and: 4' 

Принимая Мартейн Питерс комментарий во внимание:

>>> ' '.join(map(lambda tpl: '%s' % tpl[0], list)) 
'spam the in my by and' 
+1

Я думаю, что это будет считаться однозначным как 2.x, так и 3.x, но на самом деле, но это не двусмысленно для человека-читателя! Просто используя лучшее имя, чем 'i', что дает понять, что каждый элемент является кортежем, может быть достаточным, но я мог бы поставить либо лямбда-тело, либо всю лямбду в parens ... – abarnert

+0

@abarnert: roger that! ;-) –

Смежные вопросы