我写了一些脚本,但我必须添加一些条件;用户放置一个列表,它必须至少包含这些类型中的一个(元组,整数,三元组和子列表)。
如果没有4,有没有一种优雅的方式来做到这一点?
我考虑过循环并使用isinstance(i, type)
,但它很棘手,因为它反复运行并询问不同的问题'关于一种类型
for i in List:
if isinstance(i,int):
if isinstance(i,str)
如你所见,这不是很优雅。我想为每种类型设置新的变量i,j,k
,并且可能为循环做4个:
for
for
for
for
欢迎任何想法和线索。谢谢!
答案 0 :(得分:2)
您可以添加辅助功能"有":
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)
如果你想要更紧凑(但不太可读),请使用"任何"和"所有":
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)])
答案 1 :(得分:1)
您可以使用内置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_types
加速O(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
答案 2 :(得分:1)
您可以使用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')
答案 3 :(得分:0)
要获取对象的类型,可以使用内置的type()函数。将对象作为唯一参数传递将返回该对象的类型对象:
eg:
a=5
type(a) will return 'int'
答案 4 :(得分:0)
如果要检查所有实例,请使用all
,否则请使用any
,如下所示。
e.g。
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
答案 5 :(得分:0)
使用内置all
和any
:
all([any(lambda x: isInstance(x,i), lst_to_check) for i in instances_list])