我有一个元组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, )
但这似乎相当不优雅。什么是好的方法?
注意:整个问题也可以同样被问及列表
答案 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附加到它之前成为元组。这是因为尝试连接z
和x
会引发错误。
如果在编译时无法确定y
和y
的类型,则可以将z
和y
转换为列表推导中的元组,例如 -
z
示例/演示 -
from collections import Iterable
[tuple(x) + tuple(y) if isinstance(x, Iterable) else (x, ) + tuple(y) for x in z]