我有一个函数接受两个输入(两个元组),并在继续之前检查以确保它们的大小相同。在尝试计算每个元组的长度时遇到问题。
示例:
tupA = ([1,2,3,4],[11,22,33,44])
tupB = ([1,2],[3,4],[5,6])
tupC = ([1,2,3,4,5,6,7,8,9])
当我计算每个对象的长度时,它会返回:
len(tupA) = 2
len(tupB) = 3
len(tupC) = 9
是否有一种简单的方法让len(tupC)返回1?我通过添加逗号找到了解决方法:
tupD = ([1,2,3,4,5,6],)
len(tupD) = 1
但是我不想强迫用户必须添加逗号。有更好的方法吗?
答案 0 :(得分:2)
对于此类数据
tupA = ([1,2,3,4],[11,22,33,44])
tupB = ([1,2],[3,4],[5,6])
tupC = ([1,2,3,4,5,6,7,8,9])
最后一个不是tuple
,您可以检查
print(type(tupC)) #prints <class 'list'>
您可以使用isinstance
函数检查变量是否为给定类型,因此可以创建自己的函数
def mylen(x):
if isinstance(x,list):
return 1
else:
return len(x)
您的1
会给tupC
,3
会给tupB
,2
会给tupA
。
答案 1 :(得分:1)
带有一个项目的元组是通过在值后面加上逗号来构造的。
元组的唯一好处是使其不可变, 但是如果您使用列表,就没有问题。
>>> listA = [[1,2,3,4],[11,22,33,44]]
>>> listB = [[1,2],[3,4],[5,6]]
>>> listC = [[1,2,3,4,5,6,7,8,9]]
>>> len(listA)
2
>>> len(listB)
3
>>> len(listC)
1
答案 2 :(得分:1)
如评论中所述,tupC
不是元组,它是一个包含9个元素的列表。仅当逗号结尾时才是元组。
作为一种解决方法,我们可以检查它是否为列表并相应地返回结果:
def length_(tupl):
return 1 if isinstance(tupl, list) else len(tupl)
用法:
>>> tupA = ([1,2,3,4],[11,22,33,44])
>>> tupB = ([1,2],[3,4],[5,6])
>>> tupC = ([1,2,3,4,5,6,7,8,9])
>>> length_(tupA)
2
>>> length_(tupB)
3
>>> length_(tupC)
1
答案 3 :(得分:0)
请注意,tupC实际上是一个列表,而不是一个元组:
>>> tupA = ([1,2,3,4],[11,22,33,44])
>>> tupB = ([1,2],[3,4],[5,6])
>>> tupC = ([1,2,3,4,5,6,7,8,9])
>>> type(tupA), type(tupB), type(tupC)
(<class 'tuple'>, <class 'tuple'>, <class 'list'>)
如果您仍然坚持将内容保留为列表的元组而不是列表的列表,并且不想添加逗号,则可以定义自己的函数来处理:
>>> def newlength(x):
... if type(x) == list:
... return 1
... return len(x)
...
>>> print(newlength(tupA))
2
>>> print(newlength(tupB))
3
>>> print(newlength(tupC))
1
编辑:对Daweo表示敬意,他在几分钟之前击败了我一个几乎完全相同的答案!