您可以使用內置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_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