Python 检查列表是否包含int、str、tuple和sub-list的优雅方法

Python 检查列表是否包含int、str、tuple和sub-list的优雅方法,python,python-2.7,Python,Python 2.7,我写了一些脚本,但我必须添加一些条件;用户放置一个列表,它必须至少包含这些类型中的一种(tuple、int、str和sub-list) 没有4个if,有没有一种优雅的方法可以做到这一点 我考虑过for循环和使用isinstance(I,type),但这很棘手,因为它会反复运行,并对一种类型提出不同的“问题” for i in List: if isinstance(i,int): if isinstance(i,str) 正如你看到的,这不是很优雅。我考虑为每种类型添加新变量I,j

我写了一些脚本,但我必须添加一些条件;用户放置一个列表,它必须至少包含这些类型中的一种(tuple、int、str和sub-list)

没有4个if,有没有一种优雅的方法可以做到这一点

我考虑过for循环和使用
isinstance(I,type)
,但这很棘手,因为它会反复运行,并对一种类型提出不同的“问题”

for i in List:
  if isinstance(i,int):
    if isinstance(i,str)
正如你看到的,这不是很优雅。我考虑为每种类型添加新变量
I,j,k
,可能为循环添加4个变量:

for
  for
   for
    for

欢迎任何想法和线索。谢谢

要获取对象的类型,可以使用内置函数。将对象作为唯一参数传递将返回该对象的类型对象:

 eg:
    a=5
    type(a) will return 'int'

您可以添加一个助手函数“has”:

如果您希望更紧凑(但可读性较差),请使用“any”和“all”:


如果要检查所有实例是否通过,请使用
all
,否则使用
any
,如下所示

e、 g

输出-

passed
passed
passed
您可以使用内置函数。报价文件:

任何(可编辑)

如果iterable的任何元素为True,则返回
True
。如果 iterable为空,返回
False

示例用法:

expected_types = {int, str, tuple, list}  # set of expected types
for i in seq:
    if any(isinstance(i, t) for t in expected_types):
        pass  # do something
要检查序列的所有元素,可以使用内置函数。因此,要检查序列的所有元素,您只需使用:

expected_types = {int, str, tuple, list}
if all(any(isinstance(i, t) for t in expected_types) for i in seq):
    pass  # condition is sufficient
all()
any()
都执行短路,因此操作具有合理的性能。如果您不关心子类,您可以检查类型-它会加快预期类型中t的持续时间(i,t)从
O(n)
O(1)

上述所有检查都测试所有对象是否都是
预期的\u类型之一的实例,但不是所有类型都按顺序出现。如果您想确保“每种类型中至少有一种”条件,您可以使用


使用内置的
all
any

all([any(lambda x: isInstance(x,i), lst_to_check) for i in instances_list])

您可以将不同类型的元组与
isinstance
一起使用:

>>> isinstance('a', (str, list, tuple, int))
True
任意

>>> data = [1, 'a', (2, 4, 6)]
>>> any(isinstance(x, (str, list, tuple, int)) for x in data)
True
或者,如果要对这些类型的对象执行某些操作:

for x in data:
    if isinstance(x, (str, list, tuple, int)):
        print('found')
c = collections.Counter(type(o) for o in seq)
if all(c[t] >= 1 for t in {int, list, tuple, str}):
    pass  # seq contains at least one of each type
all([any(lambda x: isInstance(x,i), lst_to_check) for i in instances_list])
>>> isinstance('a', (str, list, tuple, int))
True
>>> data = [1, 'a', (2, 4, 6)]
>>> any(isinstance(x, (str, list, tuple, int)) for x in data)
True
for x in data:
    if isinstance(x, (str, list, tuple, int)):
        print('found')