2

If I have two lists that look like this:

list1 = ['a', 'a', 'b', 'c']
list2 = ['a', 'a', 'a', 'b']

How can I check if the second list is contained in the first? I assume sets would not work, because the letters can be repeated.

2 Answers2

2

Sets won't work if the frequency matter but counting the frequency will:

from collections import Counter
list1 = ['a', 'a', 'b', 'c']
list2 = ['a', 'a', 'a', 'b']
cn1, cn2 = Counter(list1), Counter(list2)
print(all(cn2[k] <= v for k, v in cn1.items()))

If the count of each string in list2 is <= to the amount of times it appears in list1 you have all the strings from list2 in list1, which for the lists in your question would return False but for,

list1 = ['a', 'a', 'b', 'c', 'a']
list2 = ['a', 'a', 'a', 'b'] 

would return True as you have the same amount of a's and a b.

Padraic Cunningham
  • 176,452
  • 29
  • 245
  • 321
0

Similar to @Padraic_Cunningham's answer:

from collections import Counter

def contained(l1, l2):
    cntr1 = Counter(list1)
    cntr2 = Counter(list2)
    for k in cntr2:
        if cntr2[k] != cntr1.get(k):
            return False
    return True

list1 = ['a', 'a', 'b', 'c']
list2 = ['a', 'a', 'a', 'b']

contained(list1, list2)
eestrada
  • 1,575
  • 14
  • 24