安全转换为元组/列表

时间:2015-08-13 16:12:20

标签: python

我有一个元组y = (3,4),我想将其附加到列表z的每个元素。

如果z包含我可以执行的单个元素:

>>> z = [1, 2]
>>> [(x, ) + y for x in z]
[(1, 3, 4), (2, 3, 4)]

如果z包含我可以做的元组:

>>> z = [(0, 1), (1, 2)]
>>> [x + y for x in z]
[(0, 1, 3, 4), (1, 2, 3, 4)]

如果我事先不知道z是单个元素还是元组/列表,我该怎么办?

我试过了:

>>> z = [1, 2]
>>> [tuple(x) + y for x in z]

但这给了我:

TypeError: 'int' object is not iterable

显然,我可以创建一个测试元组的函数:

In [38]: def tuplify(x):
   ....:     try:
   ....:         return tuple(x) # This is 'transparent' if x is already a tuple
   ....:     except TypeError:
   ....:         return (x, )

但这似乎相当不优雅。什么是好的方法?

注意:整个问题也可以同样被问及列表

2 个答案:

答案 0 :(得分:4)

如果你真的想要一个单行,那么:

android:id="@+id/list

会为你效劳。

这是尝试列表和元组列表的结果:

[x + y if isinstance(x, tuple) else (x, ) + y for x in z]

如果>>> y = (3,4) >>> z = [1, 2] >>> [x + y if isinstance(x, tuple) else (x, ) + y for x in z] [(1, 3, 4), (2, 3, 4)] >>> z = [(0, 1), (1, 2)] >>> [x + y if isinstance(x, tuple) else (x, ) + y for x in z] [(0, 1, 3, 4), (1, 2, 3, 4)] 是一个列表,这将有效:

y

答案 1 :(得分:2)

仅仅是因为评论中提到了这一点 -

  

有没有办法让isinstance覆盖元组和列表?

是的,有一种方法可以涵盖列表和元组以及其他类型的迭代。您可以针对collections.Iterable查看isinstance。显示列表和元组的示例为Iterable -

>>> from collections import Iterable
>>> isinstance(list(),Iterable)
True
>>> isinstance(tuple(),Iterable)
True

您的代码看起来像 -

from collections import Iterable
[x + y if isinstance(x, Iterable) else (x, ) + y for x in z]

如果您希望内部列表始终为tuple,则可以执行 -

from collections import Iterable
[tuple(x) + y if isinstance(x, Iterable) else (x, ) + y for x in z]

因此,即使inner的{​​{1}}列表是列表,它也会在y附加到它之前成为元组。这是因为尝试连接zx会引发错误。

如果在编译时无法确定yy的类型,则可以将zy转换为列表推导中的元组,例如 -

z

示例/演示 -

from collections import Iterable
[tuple(x) + tuple(y) if isinstance(x, Iterable) else (x, ) + tuple(y) for x in z]