Я пытаюсь распечатать приведенный ниже кортеж 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
Может ли кто-нибудь помочь мне с этим вопросом?






Вы также должны присоединиться к содержимому 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'
Сначала вы добавляете zoo в свой кортеж new_zoo. Вместо этого вы должны развернуть его, чтобы расширить new_zoo.
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'
Самый простой способ - добавить кортежи вместо их вложения:
>>> new_zoo = ('monkey', 'camel') + zoo
Другой способ создать сплющенный кортеж - использовать распаковку звездочкой (иногда называемую в просторечии 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
TypeError: sequence item 2: expected str instance, tuple found
Как говорится в сообщении об ошибке: элемент 2 в new_zoo (не забудьте начать отсчет с 0, поэтому это последний элемент) должен иметь тип str для join, но вместо этого это кортеж.
Кажется, что вы хотите расширить свой кортеж zoo, но вместо этого вы подключаете его как элемент в 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))
Вы можете просто сложить кортежи вместе:
new_zoo=('monkey','camel') + zoo