1. ホーム
  2. python

[解決済み] リストのすべての要素が同じ型であるかどうかをチェックする

2023-01-12 07:11:07

質問

リストの要素が同じ型であるかどうか、可能であればすべての要素を個別にチェックせずに確認するにはどうしたらよいでしょうか。

例えば、このリストのすべての要素が整数であることをチェックする関数を持ちたいと思います(これは明らかに誤りです)。

x = [1, 2.5, 'a']

def checkIntegers(x):
    # return True if all elements are integers, False otherwise

どのように解決するのですか?

以下のように all と組み合わせて isinstance :

all(isinstance(x, int) for x in lst)

複数のタイプをチェックすることもできます。 isinstance で複数の型をチェックすることもできます。

all(isinstance(x, (int, long)) for x in lst)


継承されたクラスも拾ってくれるわけではありませんが、例えば

class MyInt(int):
     pass

print(isinstance(MyInt('3'),int)) #True

もし、あなたが が必要な場合 を整数だけに制限する場合は all(type(x) is int for x in lst) . しかし、これは very まれなシナリオです。


これで書ける楽しい関数は、他のすべての要素が同じ型である場合に、シーケンスの最初の要素の型を返すものです。

def homogeneous_type(seq):
    iseq = iter(seq)
    first_type = type(next(iseq))
    return first_type if all( (type(x) is first_type) for x in iseq ) else False

これは任意のイテラブルに対して動作しますが、その過程で "イテレータ" を消費します。

共通の基の集合を返す、同じようなもう一つの楽しい関数です。

import inspect
def common_bases(seq):
    iseq = iter(seq)
    bases = set(inspect.getmro(type(next(iseq))))
    for item in iseq:
        bases = bases.intersection(inspect.getmro(type(item)))
        if not bases:
           break
    return bases