次の点に注意してください。
>>>listA = ['a', 'a', 'b','b','b','c']
>>>listB = ['b', 'a','a','b','c','d']
>>>all(item in listB for item in listA)
True
英語のように「all」行を読む場合、これは間違いではありませんが、listAには3番目の「b」がありますがlistBにはないため、誤解を招く可能性があります。
これにも同じ問題があります。
def list1InList2(list1, list2):
for item in list1:
if item not in list2:
return False
return True
ただのメモ。以下は機能しません。
>>>tupA = (1,2,3,4,5,6,7,8,9)
>>>tupB = (1,2,3,4,5,6,6,7,8,9)
>>>set(tupA) < set(TupB)
False
タプルをリストに変換しても、それでも機能しません。文字列が機能する理由はわかりませんが、intは機能しません。
動作しますが、要素の発生数を保持しないという同じ問題があります。
>>>set(tupA).issubset(set(tupB))
True
セットの使用は、複数回出現要素のマッチングのための包括的なソリューションではありません。
しかし、ここに、試行/例外なしでのshantanooの答えに対するワンライナーソリューション/適応があります:
all(True if sequenceA.count(item) <= sequenceB.count(item) else False for item in sequenceA)
三元条件演算子を使用してリスト内包をラップする組み込み関数。Pythonは素晴らしいです!「<=」は「==」であってはならないことに注意してください。
このソリューションでは、シーケンスAとBは、タプルとリスト、および「カウント」メソッドを使用したその他の「シーケンス」と入力できます。両方のシーケンスの要素は、ほとんどのタイプにすることができます。現在のようにdictsでこれを使用しないので、「iterable」の代わりに「sequence」を使用します。