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



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


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

6 ответов:

Самый простой способ-это добавить кортежи вместо того, чтобы вложить их:

>>> 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

Во-первых, вы добавляете 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'

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

Comments

    Ничего не найдено.