Python проверка того, имеют ли два списка одинаковое значение в одном индексе - PullRequest
0 голосов
/ 05 мая 2020

поэтому мне даны два списка

lst1 =[0,1,1,1,0]
lst2 =[0,0,1,1,0]

, и мне нужно увидеть, какой индекс в обоих списках имеет значение 1, вот мой код

x = list(zip(lst1,lst2))
for i in range(len(x)):
    flag = 0
    for y in range(len(x[i])):
        if x[i][y] == 1:
            flag +=1
    if flag == 2:
        z = x.index(x[i])
        print(z)

, но он печатает Индекс 2 и 2 вместо 2 и 3 может кто-нибудь указать здесь на проблему, спасибо

Ответы [ 7 ]

1 голос
/ 05 мая 2020

Есть много ответов о том, как это сделать лучше.

Что касается вашего фрагмента кода, List.index всегда дает первый соответствующий элемент в списке. Вот почему мы 2,2

>>> lst1 =[0,1,1,1,0]
>>> lst2 =[0,0,1,1,0]
>>> x = list(zip(lst1,lst2))
>>> x
[(0, 0), (1, 0), (1, 1), (1, 1), (0, 0)]
>>> x.index((1,1))
2
>>> x.index((1,1))
2
1 голос
/ 05 мая 2020

Предполагая, что они одинаковой длины, вы можете использовать это:

>>> [i for i, (x, y) in enumerate(zip(lst1, lst2)) if x == y == 1]
[2, 3]
1 голос
/ 05 мая 2020

Вы можете сделать следующее:

lst1 =[0,1,1,1,0]
lst2 =[0,0,1,1,0]
assert len(lst1) == len(lst2)

idx = [i for i in range(len(lst1)) if lst1[i] == 1 and lst2[i] == 1]

print(idx)

Другое решение, использующее numpy:

import numpy as np

lst1 =[0,1,1,1,0]
lst2 =[0,0,1,1,0]
assert len(lst1) == len(lst2)
lst1_ = np.array(lst1)
lst2_ = np.array(lst2)

idx_ = np.intersect1d(np.where(lst1_ == 1)[0],np.where(lst2_ == 1)[0])
print(list(idx_))

Другой альтернативой является переключение следующей строки:

idx_ = np.intersect1d(np.where(lst1_ == 1)[0],np.where(lst2_ == 1)[0])

Автор:

idx_ = np.where((lst1_==1)&(lst2_==1))[0]

Как указано @yatu, следует использовать побитовые операции.

0 голосов
/ 05 мая 2020

Вы также можете использовать поэлементную & операцию NumPy, а также argwhere для этого:

>>> np.argwhere((np.array(lst1) == 1) & (np.array(lst2) == 1)).ravel()
array([2, 3])
0 голосов
/ 05 мая 2020

Смотри, просто перебрать оба списка. Предположим, вы знаете длину обоих списков, тогда просто выполните следующие действия:

lst1 =[0,1,1,1,0]
lst2 =[0,0,1,1,0]

# as we know length of the both lists, and their length are equal, 
# i'll just write length as 5, but you can have other algorhitm of finding length

list_len = 5

is_there_any_matches = False

for index in range(list_len):

    if lst1[index] == lst2[index]:

       is_there_any_matches = True
       break                           # to exit after first match

Обратите внимание, что это прервет цикл после первого совпадения, но вы можете удалить break и вместо этого подсчитать количество совпадений. Кроме того, всегда выбирайте меньшую длину списка, чтобы предотвратить ошибку сценария с индексом списка вне допустимого диапазона. Приятного вам времени!


EDIT

Я попытался сделать это как можно проще, но вы можете использовать генераторы или другие трюки pythoni c чтобы сделать его использование короче и удобнее.

0 голосов
/ 05 мая 2020

Вы можете сделать это поэлементно and:

l = [i for i, _ in enumerate(lst1 and lst2) if _ == 1]

С помощью функции and, только в тех случаях, когда оба элемента списка имеют значение 1, выражение вернет 1 , что кажется идеальным для вашего вопроса.

0 голосов
/ 05 мая 2020

Вы можете перебирать пары значений и их индекс в одном l oop:

for idx, (i, j) in enumerate(zip(lst1, lst2)):
    if i == j == 1:
        print(idx)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...