【问题标题】:Concatenate tuple with variable用变量连接元组
【发布时间】:2016-03-27 13:57:12
【问题描述】:

我有一个元组x = (2,),我想在其中附加一个变量y。我提前不知道y 到底是个什么样的变量。

y 可能是:

  • 一个元组,在这种情况下我很乐意使用x+y,或者
  • 单个对象(通常是字符串或整数),在这种情况下我应该使用x+(y,)

采用一种策略会在一半的情况下给我一个 TypeError,而采用另一种策略会在我想要(2, 3, 4) 时给我(2, (3, 4))

处理这个问题的最佳方法是什么?

【问题讨论】:

  • 一方面,元组是不可变的,因此您正在创建一个新对象。另一方面,您可以捕获错误并尝试其他方法。
  • 有时你会得到元组,有时会附加标量,这让我很困扰。在 python 中,您可以获得不同类型的值的唯一有效场景是在模拟函数重载时。在这种情况下,检查 type(y) == tupleisinstance(y, tuple)isinstance(y, collections.Iterable) 完全没问题
  • 感谢 Jon,我的语言有点松散,它确实是一个新对象。就 Tamas 而言,我正在处理可以在多个集合上索引的框架内的对象。当我迭代在单个集合上定义的对象时,我会得到单个项目索引,但如果我正在迭代在多个集合上定义的对象,在这种情况下,我会得到元组。

标签: python tuples concatenation


【解决方案1】:

使用第二种策略,只需检查您是添加具有多个项目还是单个项目的可迭代对象。

您可以通过检查 __iter__ 属性的存在来查看对象是否为可迭代对象(tuplelist 等)。例如:

# 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,)

试试这个。这个 sn-p 的行为与您在问题中描述的完全一样。

请注意,在 Python 3 中,字符串具有 __iter__ 方法。在 Python 2.7 中:

>>> hasattr("abc", "__iter__")
False

在 Python 3+ 中:

>>> hasattr("abc","__iter__")
True

如果您使用的是 Python 3,而您在问题中未提及,请将 hasattr(y, "__iter__") 替换为 hasattr(y, "__iter__") and not isinstance(y, str)。这仍然会考虑元组或列表。

【讨论】:

  • 请注意str 也有__iter__ 作为属性。所以x(2)y'hi',输出将为(2,'h','i')
  • @LukeTaylor 正如 Tamas 在 cmets 中提到的问题 - 可移植和 Pythonic 方法不是检查是否存在 dunder 方法,而是使用 isinstance(y, collections.Iterable)...
  • 已编辑以注意 Python 2 与 3 的区别。
  • @LukeTaylor 我更喜欢使用可以保证工作的工具,不需要了解实现细节,可以跨版本工作并且不需要解释为什么它可以在一种情况下工作但不是另一个:p
  • 关于你的更新 - 不要忘记像对象、集合和字典这样的文件也是可迭代的,数组、字节数组、字节等也是如此...... - 特殊情况字符串比它更容易将所有其他需要可迭代状态的类型对象列入白名单
【解决方案2】:

if 条件中使用isinstance

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

【讨论】:

  • 如果 y 是一个列表,这将不起作用。请参阅我的答案,这对于可能附加到元组的任何可迭代类型都更加健壮。
  • @Luke,已经提到y 可以是元组或整数或字符串。
  • OP 只提到元组作为可迭代对象,我只是假设他的意思是具有多个项目的可迭代对象。他没有指定唯一的“单一对象”类型可以是字符串或整数:“单个对象(通常字符串或整数)”
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2023-04-08
相关资源
最近更新 更多