簡體   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