在Python中迭代包含元组和int的列表
因此,我创建了以下列表:在Python中迭代包含元组和int的列表,python,list,loops,tuples,Python,List,Loops,Tuples,因此,我创建了以下列表: l = [(1,2,3),(4,5),6] 但当我这么做的时候: for i in l: print (i[0]) 它会向我发送以下错误消息: Traceback (most recent call last): File "<stdin>", line 2, in <module> TypeError: object of type 'int' has no len() 回溯(最近一次呼叫最后一次): 文件“”,第2行,在 T
l = [(1,2,3),(4,5),6]
但当我这么做的时候:
for i in l:
print (i[0])
它会向我发送以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
TypeError: object of type 'int' has no len()
回溯(最近一次呼叫最后一次):
文件“”,第2行,在
TypeError:类型为“int”的对象没有len()
所以我想知道,如果是int
,是否有一种方法可以打印数字,如果是tuple
,是否有第一个元素
我希望我已经向你说清楚了,如果你不明白,请不要犹豫
提前感谢您。使用
isinstance
:
l = [(1,2,3),(4,5),6]
for i in l:
if isinstance(i,int):
print(i)
elif isinstance(i,tuple):
print(i[0])
# 1
# 4
# 6
使用列表理解,以列表形式输出:
[i if isinstance(i,int) else i[0] for i in l]
# [1, 4, 6]
要支持其他数据类型(浮点而不是整数,列表而不是元组):
请注意,如果要打印字符串的所有字符,这将不起作用。如果希望安全并打印iterable的第一项,则可以应用下标,
hasattr
检查Python对象是否具有某种方法,其中\uuuuu getitem\uuuuuuuu>相当于切片函数:
l = [(1,2,3),[4,5],6]
for i in l:
if hasattr(i, '__getitem__'):
print(i[0])
else:
print(i)
>> 1
4
6
这确保您始终可以从序列中选择索引,给定类型列表
或元组
。请注意,str
类型也是一个可编辑的序列。如果要排除它们,可以使用isinstance
检查对象的类型,在本例中,我们检查not str
和是否可编辑
:
import collections
for i in l:
if not isinstance(i, str) and isinstance(i, collections.Iterable):
print(i[0])
else:
print(i)
是的,只要打印(i if isinstance(i,int)else i[0])@OlivierMelançon简言之,你能告诉我使用isinstance
比直接补偿的优势吗。@meW它本身并不“更好”,但它考虑了继承性,在某些特定情况下更通用。“请求原谅比允许更容易”(试试
…除了
)通常比if
..else
更像蟒蛇。但超出了问题的范围,应该注意,如果i
类型为str
,则将打印i
的第一个字符,而不是所有i
。例如i='90'
将给出9
而不是90
import collections
for i in l:
if not isinstance(i, str) and isinstance(i, collections.Iterable):
print(i[0])
else:
print(i)