2015-12-07 13 views
1

我寫了一些腳本,但我必須添加一些條件;用戶放置一個列表,並且它必須至少包含這些類型之一(元組,子元素,子元素和子列表)。優雅的方式來檢查列表是否包含int,str,元組和子列表

有沒有一個優雅的方式做到這一點,沒有4,如果?

我想到了循環使用isinstance(i, type)但它的棘手,因爲它運行一遍又一遍,並要求不同的「問題」有關的一種類型

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

的正如你看到的,這是不是很優雅。我想過把新的變量i,j,k爲每一種類型的,也許對循環做4:

for 
    for 
    for 
    for 

任何想法和線索的歡迎。謝謝!

回答

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

要獲取對象的類型,可以使用內置的type()函數。傳遞一個對象作爲唯一的參數將返回對象的類型對象:

eg: 
    a=5 
    type(a) will return 'int' 
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)]) 
0

如果你要檢查所有實例,然後如果pass使用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 
1

您可以使用內置any功能。引用文檔:

任何(迭代)

返回True如果迭代的任何元素是真實的。如果 迭代器爲空,則返回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 
0

使用內置allany

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