Если есть два списка, l1
и l2
, и мы должны проверить, присутствует ли каждый элемент l1
в l2
, лучше преобразовать l2
в set
и проверитьдля членства каждого элемента l1
в set(l2)
.
Тесты членства занимают O(n)
время для lists
и O(1)
время для sets
.Использование set
уменьшит временную сложность требуемого кода до O(n)
, который в противном случае был бы O(n<sup>2</sup>)
.
l1 = ['a', 'b', 'c']
l2 = ['b', 'c']
# Converting to a set takes O(n) time
s2 = set(l2) # {'c', 'b'}
# Each of the following approaches takes O(n) time
# Normal approach
contains_n = []
for x in l1:
contains_n.append(x in s2)
# Using a list comprehension
contains_lc = [
x in s2
for x in l1
]
# Using a functional approach
contains_f = list(map(lambda x: x in s2, l1))
print(f'contains_n: {contains_n}')
print(f'contains_lc: {contains_lc}')
print(f'contains_f: {contains_f}')
Вывод:
contains_n: [False, True, True]
contains_lc: [False, True, True]
contains_f: [False, True, True]