如何无括号打印一个由元组组成的元组

8
我正在尝试打印下面这个元组new_zoo,并且不带括号:
zoo=('python','elephant','penguin')
new_zoo=('monkey','camel',zoo)

通常我们可以使用', '.join(...)。但是因为这里new_zoo元组包含一个内部元组zoo,所以当我使用', '.join(new_zoo)时,它会显示:

TypeError: sequence item 2: expected str instance, tuple found

有人能帮我解答这个问题吗?


你可以直接将元组相加:new_zoo=('monkey','camel') + zoo - dotcomly
6个回答

4

首先,您将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'

4
最简单的方法是将元组相加而不是嵌套它们:
>>> 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

3

您还需要加入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'

2
类型错误:序列项目2:期望字符串实例,但发现元组。
正如错误信息所述:在new_zoo中的第2个项目(记得从0开始计数,所以是最后一个项目)需要是str类型,以便join使用,但它是一个元组。
看起来你想扩展你的zoo元组,但你把它作为一个项目插入到zoo中。换句话说,你把一个盒子放进另一个盒子里,而不是把第一个盒子里的物品放进第二个盒子里。
你可能想做这样的事情:
new_zoo=('monkey','camel')+zoo

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

0

只需跟踪元组,然后使用递归,现在无论您有多少个嵌套的元组:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接