Python 用变量连接元组
我有一个元组Python 用变量连接元组,python,tuples,concatenation,Python,Tuples,Concatenation,我有一个元组x=(2,),我想在其中附加一个变量y。我事先不知道确切的变量y是什么类型 y可以是: 一个元组,在这种情况下我很乐意使用x+y,或者 单个对象(通常是字符串或int),在这种情况下,我应该使用x+(y,) 采用一种策略会在一半时间内给我一个TypeError,而采用另一种策略会在我需要时给我(2,(3,4)) 处理此问题的最佳方法是什么?在if条件下使用 >>> x = (2,) >>> y1 = (1,2) >>> y2
x=(2,)
,我想在其中附加一个变量y
。我事先不知道确切的变量y
是什么类型
y
可以是:
- 一个元组,在这种情况下我很乐意使用
,或者x+y
- 单个对象(通常是字符串或int),在这种情况下,我应该使用
x+(y,)
(2,(3,4))
处理此问题的最佳方法是什么?在if
条件下使用
>>> x = (2,)
>>> y1 = (1,2)
>>> y2 = 2
>>> def concat_tups(x,y):
... return x + (y if isinstance(y,tuple) else (y,))
...
>>> concat_tups(x,y2)
(2, 2)
>>> concat_tups(x,y1)
(2, 1, 2)
>>>
使用第二种策略,只需检查是添加包含多个项的iterable还是添加单个项 通过检查是否存在
\uu iter\uuuu
属性,可以查看对象是否为iterable(元组
,列表
,等等)。例如:
# Checks whether the object is iterable, like a tuple or list, but not a string.
if hasattr(y, "__iter__"):
x += tuple(y)
# Otherwise, it must be a "single object" as you describe it.
else:
x += (y,)
试试这个。这个片段的行为将与您在问题中描述的完全相同
请注意,在Python3中,字符串有一个\uuuu iter\uuu
方法。在Python 2.7中:
>>> hasattr("abc", "__iter__")
False
在Python 3+中:
>>> hasattr("abc","__iter__")
True
如果您使用的是Python 3(您在问题中没有提到),请将
hasattr(y,“\uu iter\uu”)
替换为hasattr(y,“\uu iter\uuu”),而不是isinstance(y,str)
。这仍然会考虑元组或列表 首先,元组是不可变的,所以您正在创建一个新对象。另一方面,您可以捕获错误并尝试另一种方法。有时需要附加元组,有时需要附加标量,这让我很困扰。在python中,唯一可以获得不同类型值的有效场景是在模拟函数重载时。在这种情况下,检查type(y)=tuple
或isinstance(y,tuple)
或isinstance(y,collections.Iterable)
谢谢Jon,我的语言有点松散,它确实是一个新对象。就塔马斯的观点而言,我正在一个可以在多个集合上建立索引的框架内处理对象。当我迭代在单个集合上定义的对象时,我会得到单个项索引,但是如果我迭代在多个集合上定义的对象,那么我会得到元组。如果y是列表,这不起作用。请看我的答案,它对于任何可能附加到元组的iterable类型都更为健壮。@Luke,有人提到,y
只能是元组、int或字符串。OP只提到元组是iterable,我只是假设他指的是包含多个项的iterable。他没有指定唯一的“单对象”类型可以是string或int:“单个对象(通常是string或int)”注意,str
也有\uuuuuuu iter\uuu
作为属性。因此,使用x
as(2)
和y
as'hi'
,输出将是(2,'h','i')
@LukeTaylor,正如塔马斯在对这个问题的评论中提到的那样-可移植和python方法不是检查dunder方法的存在,而是使用isinstance(y,collections.Iterable)
…编辑以注意Python 2与Python 3的区别。@LukeTaylor我更喜欢使用保证工作的工具,这些工具不需要了解实现细节,跨版本工作,也不需要解释为什么它在一种情况下工作,但在另一种情况下不工作:预归档更新-不要忘记类似文件的对象,集合和dict也是可写的,数组、ByteArray、字节等也是可写的使用特殊大小写字符串比将所有其他类型对象(其iterable状态是理想的)列入白名单要容易得多