Python3检查列表是否只包含元组

时间:2014-07-23 18:54:41

标签: python python-3.x tuples typechecking

我尝试了以下内容:

vrs = [('first text', 1),
       ('second text', 2),
       ('third text', 3),
       ('fourth text', 4),
       ('fifth text', 5),
       ('sixth text', 6),
       ('seventh text', 7),
       ('eighth text', 8),
       ('ninth text', 9),
       ('tenth text', 10),
       ('eleventh text', 11),
       ('twelfth text', 12)
      ]

if all(vr is tuple for vr in vrs):
    print('All are tuples')
else:
    print('Error')

if set(vrs) == {tuple}:
    print('All are tuples')
else:
    print('Error')

两者的输出均为Error

有没有办法检查这个(即检查列表中的每个元素是否为元组)没有循环?

3 个答案:

答案 0 :(得分:4)

使用isinstance

isinstance(object, classinfo)

如果object参数是classinfo参数的实例,或者是(直接,间接或虚拟)子类的实例,则返回true。

vrs = [('first text', 1),
   ('second text', 2),
   ('third text', 3),
   ('fourth text', 4),
   ('fifth text', 5),
   ('sixth text', 6),
   ('seventh text', 7),
   ('eighth text', 8),
   ('ninth text', 9),
   ('tenth text', 10),
   ('eleventh text', 11),
   ('twelfth text', 12)
  ]    
all(isinstance(x,tuple) for x in vrs)
True
vrs = [('first text', 1),
   ('second text', 2),
   ('third text', 3),
   ('fourth text', 4),
   ('fifth text', 5),
   ('sixth text', 6),
   ('seventh text', 7),
   ('eighth text', 8),
   ('ninth text', 9),
   ('tenth text', 10),
   ('eleventh text', 11),
   'twelfth text'
  ]
  all(isinstance(x,tuple) for x in vrs)
  False

答案 1 :(得分:2)

vr is tuple不检查绑定到名称vr的对象是否为tuple类型,它会检查名称是否绑定到同一对象< / em>(即评估id(vr) == id(tuple))。不可避免地,他们不是; tupletype个实例,而不是tuple个实例!

相反,您应该使用isinstance

if all(isinstance(vr, tuple) for vr in vrs):

这支持继承(与例如if all(type(vr) == tuple ...)不同),因此这也允许例如输入中有一个namedtuple

但是,在Python中,并不总是需要检查特定对象的类型(它使用强大的动态类型,也称为"duck typing")。虽然不清楚为什么要确保它们都是元组,但是有可能例如sequence types(例如tupleliststr)可以接受吗?

答案 2 :(得分:-1)

您可以使用过滤器删除所有元组元素,例如:

nontuples = filter(lambda vr : vr is not tuple, vrs)

然后检查剩余的iterable是否为空。如果您使用的是Python 3.x,它将不会是一个列表,但您可以使用

创建一个列表
nontuples = list(nontuples)