の最も内側のリストをb
set( s
) に変換し、反復しa
て、 に項目がa
存在するかどうかを確認しs
ます。
tot_items_b = sum(1 for x in b for y in x) #total items in b
セットはO(1)
ルックアップを提供するため、全体的な複雑さは次のようになります。
O(max(len(a), tot_items_b))
def func(a, b):
#sets can't contain mutable items, so convert lists to tuple while storing
s = set(tuple(y) for x in b for y in x)
#s is set([(41, 2, 34), (98, 23, 56), (42, 25, 64),...])
return any(tuple(item) in s for item in a)
デモ:
>>> a = [[1, 2, 3], [4, 5, 6], [4, 2, 3]]
>>> b = [[[11, 22, 3], [12, 34, 6], [41, 2, 34], [198, 213, 536], [1198, 1123, 1156]], [[11, 22, 3], [42, 25, 64], [43, 45, 23]], [[3, 532, 23], [4, 5, 6], [98, 23, 56], [918, 231, 526]]]
>>> func(a,b)
True
ヘルプany
:
>>> print any.__doc__
any(iterable) -> bool
Return True if bool(x) is True for any x in the iterable.
If the iterable is empty, return False.
すべての共通要素を取得するには、集合交差を使用します。
>>> s_b = set(tuple(y) for x in b for y in x)
>>> s_a = set(tuple(x) for x in a)
>>> s_a & s_b
set([(4, 5, 6)])