как напечатать кортеж кортежей без скобок

Я пытаюсь распечатать кортеж 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))