как напечатать кортеж кортежей без скобок
Я пытаюсь распечатать кортеж new_zoo
приведенный ниже без скобок:
zoo=('python','elephant','penguin')
new_zoo=('monkey','camel',zoo)
Я знаю, обычно мы можем использовать ', '.join(...)
. Но потому что здесь new_zoo
кортеж содержит внутренний кортеж зоопарк, поэтому, когда я использую ', '.join(new_zoo)
это показывает:
TypeError: sequence item 2: expected str instance, tuple found
может кто-нибудь помочь мне с этим вопросом?
6 ответов
самый простой способ-добавить кортежи вместо их вложенности:
>>> new_zoo = ('monkey', 'camel') + zoo
другой способ создать сплющенный кортеж - использовать распаковку star (в просторечии иногда называемую splat):
>>> new_zoo = ('monkey', 'camel', *zoo)
>>> print(new_zoo)
('monkey', 'camel', 'python', 'elephant', 'penguin')
вы можете собрать строку непосредственно в этом случае: ', '.join(new_zoo)
.
Если вам нужно обработать вложенный кортеж, наиболее общим способом будет рекурсивное решение:
>>> new_zoo = ('monkey', 'camel', zoo)
>>> def my_join(tpl):
... return ', '.join(x if isinstance(x, str) else my_join(x) for x in tpl)
>>> my_join(new_zoo)
monkey, camel, python, elephant, penguin
во-первых, вы добавляете zoo
для вашего кортежа!--4-->. Вы должны развернуть его, чтобы продлить .
zoo = ('python', 'elephant', 'penguin')
new_zoo = ('monkey', 'camel', *zoo) # ('monkey', 'camel', 'python', 'elephant', 'penguin')
затем для печати, один чистый способ сделать, это развернуть Кортеж в print
и обеспечить разделитель.
print(*new_zoo, sep=', ')
# prints: monkey, camel, python, elephant, penguin
если вы хотите сохранить напечатанную строку, там вы можете использовать str.join
.
new_zoo_string = ', '.join(new_zoo) # 'monkey, camel, python, elephant, penguin'
вы должны присоединиться к содержание zoo
а также:
zoo=('python','elephant','penguin')
new_zoo=('monkey','camel',','.join(zoo))
final_zoo = ','.join(new_zoo)
выход:
'monkey,camel,python,elephant,penguin'
однако вы также можете перебирать содержимое new_zoo
и применить str.join
:
zoo=('python','elephant','penguin')
new_zoo=('monkey','camel',zoo)
final_zoo = ','.join([i if not isinstance(i, tuple) else ','.join(i) for i in new_zoo])
выход:
'monkey,camel,python,elephant,penguin'
TypeError: элемент последовательности 2: ожидаемый экземпляр str, кортеж найден
как говорится в сообщении об ошибке: пункт 2 в new_zoo
(Не забудьте начать подсчет с 0, так что это последний элемент) должен иметь тип str для join
, но вместо этого это кортеж.
похоже, что вы хотите расширить свой zoo
кортеж, но вы подключаете его как элемент в . Так сказать, вы кладете коробку в другую коробку, вместо предметов в первой вставь во второй ящик.
вы, вероятно, хотели сделать что-то вроде этого:
new_zoo=('monkey','camel')+zoo
просто отслеживайте Кортеж, а затем используйте рекурсию, теперь независимо от того, сколько вложенных кортежей у вас есть:
zoo=('python','elephant','penguin')
zoo1=('example1','example2',zoo)
zoo2=('example3','example4',zoo1)
new_zoo=('monkey','camel',zoo2)
def flat_tuple(tuple_s):
final=[]
for i in tuple_s:
if isinstance(i,tuple):
final.extend(flat_tuple(i))
else:
final.append(i)
return final
for sub in flat_tuple(new_zoo):
print(sub)
выход:
monkey
camel
example3
example4
example1
example2
python
elephant
penguin
zoo = ('python', 'elephant', 'penguin')
new_zoo = ('monkey', 'camel', zoo)
# One liner
print(', '.join(map(lambda x: x if isinstance(x, str) else ', '.join(x) if hasattr(x, '__iter__') else str(x), new_zoo)))
# Recursive and powerful
def req_join(x):
if isinstance(x, str):
return x
elif hasattr(x, '__iter__'):
return ', '.join(map(req_join, x))
else:
return str(x)
big_zoo = ('cat', new_zoo, range(5), 'dog', 123, ('lev1', ('lev2', ('lev3', ('lev4', ('lev5', range(5)))))))
print(req_join(big_zoo))