Как проверить в Python для каждого элемента списка, содержится ли он в другом списке? - PullRequest
0 голосов
/ 10 мая 2019

Как это работает в Python для проверки каждого элемента списка (скажем, l1), содержится ли он в другом списке (скажем, l2).

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

Желаемый результат - [False, True, True]. Поэтому я действительно хочу логический вектор len(l1), а не какое-то пересечение, такое как ['b', 'c'] и т. Д. Мои вопросы отличаются от этого вопроса в том смысле, что моей проблеме недостаточно знать, существует ли любой элемент из первого списка, содержащийся во втором, но , которые являются элементами, а какие нет.

Ответы [ 6 ]

2 голосов
/ 10 мая 2019

Используйте список понимания :

[x in l2 for x in l1]

Объяснение:

  • Я считаю, что это лучше всего понять, если начинать с части for x in l1: создается временная переменная x, которая зацикливает все элементы в l1, аналогично для цикла .
  • для каждого из этих x теперь проверяется, находится ли он в l2 (поэтому значение in в x in l2 имеет значение, отличное от in в x in l1).
1 голос
/ 10 мая 2019

Если есть два списка, 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]
0 голосов
/ 10 мая 2019

с использованием lambda

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

res = list(map(lambda x: x in l2, l1))

print(res)

вывод

[False, True, True]
0 голосов
/ 10 мая 2019

проверка того, находится ли элемент в списке, требует O (n) операций, если вы повторяете это много раз, стоит использовать set, который имеет тесты членства (амортизированные) O (1), давая вам

def in1d(l1, l2):
  s2 = set(l2)
  return [x in s2 for x in l1]

(заимствование соглашения о присвоении имен от numpy)

, что будет намного быстрее, когда списки станут большими (т. Е. Более нескольких сотен элементов в каждом)

0 голосов
/ 10 мая 2019

Вы можете использовать numpy array, а функцию numpy.in1d:

import numpy as np

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']
results = numpy.in1d(l1, l2)
0 голосов
/ 10 мая 2019

это тоже работает

l1 = ['a', 'b', 'c']
l2 = ['b', 'c']

result = []
for i in l1 : 
  result.append(i in l2)

но это долго

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...