как напечатать кортеж кортежей без скобок
Я пытаюсь напечатать кортеж 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Еще один способ создать сплющенный кортеж-использовать распаковку звезд (в просторечии иногда называемую 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(*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