繁体   English   中英

检查列表是否包含int,str,tuple和子列表的优雅方法

[英]Elegant way to check if a list contains int, str, tuple and sub-list

我写了一些脚本,但是我必须添加一些条件。 用户放置一个列表,并且该列表必须至少包含以下类型之一(元组,int,s tr和子列表)。

如果没有4,是否有一种优雅的方法来做到这一点?

我考虑过for循环并使用isinstance(i, type)但很棘手,因为它会反复运行并询问关于一种类型的不同“问题”

for i in List:
  if isinstance(i,int):
    if isinstance(i,str)

如您所见,这不是很优雅。 我考虑过为每种类型放置新的变量i,j,k ,也许对循环做4:

for
  for
   for
    for

任何想法和线索都受到欢迎。 谢谢!

您可以添加一个“具有”辅助函数:

def has(items, t):
    for item in items:
        if isinstance(item, t):
            return True
    return False

def check(items):
    return has(items, int)   and has(items, str) \
       and has(items, tuple) and has(items, list)

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

def has(item, t):
     return any([isinstance(items, t) for item in items])

def check(items):
     return all([has(items, t) for t in (str, int, tuple, list)])

您可以使用内置的any函数。 引用文档:

任何(迭代器)

如果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

要检查序列的所有元素,可以使用内置的all函数。 因此,要检查序列的所有元素,您可以简单地使用:

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()执行短路,因此操作具有合理的性能。 如果您不关心子类,则可以检查类型-它可以将isinstance(i, t) for t in expected_typesO(n)加快到O(1)

expected_types = {int, str, tuple, list}
if all(type(i) in expected_types for i in seq):
    pass  # condition is sufficient, but not for subclasses of int, str, tuple or list

上述测试的所有检查,如果所有的对象都是一个实例expected_types ,但如果在顺序发生的所有类型。 如果要确保“每种类型中至少有一种”条件,可以使用collections.Counter

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

您可以在isinstance使用不同类型的元组:

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

any结合

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

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

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

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

例如

types = set(['int','str','dict'])#Used set to ensure no duplicate
l = ['s',3,{'s':3}]
for j in types:
    if any(isinstance(i,eval(j)) for i in l):
        print 'passed'

输出 -

passed
passed
passed

使用内置的allany

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM