[英]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_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
您可以在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
使用內置的all
和any
:
all([any(lambda x: isInstance(x,i), lst_to_check) for i in instances_list])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.