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

Я пытаюсь распечатать приведенный ниже кортеж 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

Может ли кто-нибудь помочь мне с этим вопросом?

Вы можете просто сложить кортежи вместе: new_zoo=('monkey','camel') + zoo

dotcomly 13.03.2018 21:52
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
7
1
5 409
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы также должны присоединиться к содержимому 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))

Другие вопросы по теме