Reputation: 111
I'm trying to construct a one liner that would check if any of the values in one list are present in another list and return True or False if it does or does not.
The closest I've gotten to is the following:
[i in list1 for i in list2]
The problem with this is that it will iterate through list1 and output a list of True and Falses depending on if the items in list1 exist in list2.
What I can do is then iterate through this newly created True and False list but I can't do that in the same line. I can't use a set in this case or import any functions as I'm using this as a condition in a third party software where you can't insert sets in conditions or use functions.
Upvotes: 10
Views: 25253
Reputation: 817
Supose we have this lists:
list1 = ['bar', 'foo', 'qwerty', 9, 1]
list2 = [1, 2, 3, 'foo']
If we want to see the repeated values:
[i for i in list1 if i in list2]
The input:
['foo', 1]
If we want True false:
(map(lambda each: each in list1, list2))
The input:
[True, False, False, True]
The input is checking list2, the first value '1' exists in list1 and the last 'foo' too.
Upvotes: 3
Reputation: 2095
You could also do
set(list1).intersection(list2)
to get the set of elements that occur in both; the length of the set is 0 if there's no intersection, otherwise positive. You can treat this set as a boolean, since Python evaluates empty sets to False and nonempty sets to True.
if set(list1).intersection(list2):
print ('Lists have elements in common')
else:
print ('No elements in common')
Runtime is O(n) average-case, O(n^2) worst-case: https://wiki.python.org/moin/TimeComplexity
Upvotes: 6
Reputation: 476554
You can us an any(..)
builtin function with a generator expression:
any(e in list2 for e in list1)
So this will check if there is at least one element that occurs in both lists.
Note however that this will result in a worst-case O(n2) algorithm. If the elements are hashable for instance, and you can use a set
, we can make it an O(n) average-case algorithm.
Upvotes: 17