27

What is the easiest/fastest way to check if a list of tuples contains all the the tuples that another list does. For example:

t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
t2 = [ (3,4), (11,12) ]

would be a true case since t1 contains all the tuples in t2. I tried something like:

[i for e in t2 for i in t1 if e in i]
sorted(t1) == sorted(t2)

but this seemed to always return true. Is there a better way?

sophros
  • 14,672
  • 11
  • 46
  • 75
Lance Strait
  • 4,001
  • 4
  • 17
  • 18

3 Answers3

47

You can use sets

t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
t2 = [ (3,4), (11,12) ]
set(t2).issubset(t1)
# returns true

# or equivalent use '<=' so
set(t2) <= set(t1)
# returns true
Finn
  • 1,999
  • 2
  • 24
  • 29
8

For simplicity, you could do this:

print all(x in t1 for x in t2)

However, that's going to search through t1 for each element in t2. That probably doesn't matter when t1 is small as in this case, but to allow for larger collections I would do this:

s1 = set(t1)
print all(x in s1 for x in t2)

or this:

print set(t1).issuperset(t2)

This will generally be faster, since in is much faster for sets than for large lists. There's no major performance benefit in converting t2 to a set, regardless of size, so I wouldn't.

As always, it's better if you get your data in the "right" collection to begin with. So if the main purpose of t1 is to look things up in it, use a set in the first place rather than a list.

Steve Jessop
  • 273,490
  • 39
  • 460
  • 699
4

You can create sets from those lists and use issubset method:

>>> t1 = [ (1,2), (3,4), (5,6), (7,8), (9,10), (11,12) ]
>>> t2 = [ (3,4), (11,12) ]
>>> s1 = set(t1)
>>> s2 = set(t2)
>>> s2.issubset(s1)
True
Jan Spurny
  • 5,219
  • 1
  • 33
  • 47