Python 3: преобразование кортежа в строку - PullRequest
3 голосов
/ 24 февраля 2012

У меня есть следующий код:

var_one = var_two[var_three-1]
var_one = "string_one" + var_1

И мне нужно сделать следующее:

var_four = 'string_two', var_one

Однако, это возвращает следующую ошибку:

TypeError: Can't convert 'tuple' object to str implicity

Я пробовал такие вещи, как str(var_one) и использование strip, но они не работали.Что я могу сделать, чтобы добиться нужного мне результата?

РЕДАКТИРОВАТЬ - Вот что содержат переменные:

var_one: новая переменная

var_two: tuple

var_three: integer

var_four: new

EDIT2:

Строка в программе, которая выдает ошибку: os.system(var_four)

Ответы [ 5 ]

4 голосов
/ 24 февраля 2012
one_big_string = ''.join(tuple)   
print one_big_string 
3 голосов
/ 24 февраля 2012

То, что вы написали, прекрасно:

>>> x = 1
>>> y = 1, x
>>> 

Проблема в том, что где-то иначе в вашем коде вы используете var_four в качестве строки, где она должна быть кортежем.

Кстати, я думаю, что лучше ставить скобки вокруг таких кортежей; в противном случае я склонен думать, что они используются для распаковки кортежей.


РЕДАКТИРОВАТЬ: Существуют всевозможные способы объединения и форматирования строк - Python хорош в этом. В несколько убывающем порядке общности:

"{first_thing} {second_thing}".format(first_thing=var_one, second_thing=var_two)

"{0} {1}".format(var_one, var_two)

var_one + var_two
2 голосов
/ 24 февраля 2012

Ваш код выглядит нормально, как есть.

Попробуйте запустить import pdb; pdb.set_trace() в вашей программе, чтобы увидеть, можете ли вы найти строку, вызывающую ошибку.Вы захотите использовать ''.join(var_four) для преобразования var_four в строку перед тем, как добавить ее к тому, что хотите использовать.Обратите внимание, что это фактически создаст новую строку и не перезапишет var_four.См. Python 3 string.join () эквивалент?

Кроме того, вы должны использовать модуль subprocess вместо os.system.См. Документацию Python 3.x .

0 голосов
/ 08 марта 2019
str(my_tuple)

Это кажется слишком простым, но это работает в Python 3.6

>>> x = list(range(100))
>>> y = list(range(500, 600))
>>> zip_obj = zip(x, y)
>>> my_tuple = tuple(zip_obj)
>>> type(my_tuple)
>>> <class 'tuple'>
>>> tuple_str = str(my_tuple)
>>> tuple_str
'((0, 500), (1, 501), (2, 502), (3, 503), (4, 504), (5, 505), (6, 506), (7, 507), (8, 508), (9, 509), (10, 510), (11, 511), (12, 512), (13, 513), (14, 514), (15, 515), (16, 516), (17, 517), (18, 518), (19, 519), (20, 520), (21, 521), (22, 522), (23, 523), (24, 524), (25, 525), (26, 526), (27, 527), (28, 528), (29, 529), (30, 530), (31, 531), (32, 532), (33, 533), (34, 534), (35, 535), (36, 536), (37, 537), (38, 538), (39, 539), (40, 540), (41, 541), (42, 542), (43, 543), (44, 544), (45, 545), (46, 546), (47, 547), (48, 548), (49, 549), (50, 550), (51, 551), (52, 552), (53, 553), (54, 554), (55, 555), (56, 556), (57, 557), (58, 558), (59, 559), (60, 560), (61, 561), (62, 562), (63, 563), (64, 564), (65, 565), (66, 566), (67, 567), (68, 568), (69, 569), (70, 570), (71, 571), (72, 572), (73, 573), (74, 574), (75, 575), (76, 576), (77, 577), (78, 578), (79, 579), (80, 580), (81, 581), (82, 582), (83, 583), (84, 584), (85, 585), (86, 586), (87, 587), (88, 588), (89, 589), (90, 590), (91, 591), (92, 592), (93, 593), (94, 594), (95, 595), (96, 596), (97, 597), (98, 598), (99, 599))'
>>> 
0 голосов
/ 24 февраля 2012

os.system ожидает строку, которая будет выполняться в оболочке, но вместо этого вы даете ей кортеж.

Представьте, что мы хотим запустить команду rm -rf /home/mike. Вы можете делать что-то вроде

binary_and_option = 'rm -rf'
directory = '/home/mike'

command = binary_and_option, directory # This is the tuple 
                                       #    ('rm -rf', '/home/mike') 
                                       # it is NOT the string 
                                       #     'rm -rf /home/mike'

os.system(command) # this clearly won't work, since it's just 
                   # os.system(('rm -rf', '/home/mike')) 

вместо этого вы хотите

command = "%d %d" % (binary_and_option, directory)

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


Но подождите , это еще не все! Вы никогда не хотите использовать os.system, особенно когда вы собираетесь создавать команды. Он вызывает оболочку (которая создает ненужные угрозы безопасности и другие штрафы) и имеет негибкий API. Вместо этого используйте модуль subprocess.

import subprocess 

binary_and_option = ['rm', '-rf']
directory = '/home/mike'

command = binary_and_option + [directory]

subprocess.call(command)
...