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