Сравнение двух списков на Python

avatar
dfairch
7 апреля 2018 в 21:52
123
4
2

Мне нужна помощь в сравнении двух списков и возвращении индексов, которые не совпадают.

a = [0, 1, 1, 0, 0, 0, 1, 0, 1]
b = [0, 1, 1, 0, 1, 0, 1, 0, 0]

индексы 4 и 8 не совпадают, и мне нужно вернуть это в виде списка [4,8]

Я испробовал несколько методов, но они мне не помогли.

Источник
Idodo
7 апреля 2018 в 22:00
1

Смотрите ответ на свой вопрос уже здесь: coderhelper.com/questions/35713093/…

progmatico
7 апреля 2018 в 22:03
0

Это, безусловно, поможет, но это не дубликат, OP хочет индексы, а не значения.

Ответы (4)

avatar
Aaditya Ura
8 апреля 2018 в 06:49
1

Вы можете использовать почтовый индекс:

a = [0, 1, 1, 0, 0, 0, 1, 0, 1]
b = [0, 1, 1, 0, 1, 0, 1, 0, 0]

count=0
indices=[]
for i in zip(a,b):
    if i[0]!=i[1]:
        indices.append(count)

    count+=1

print(indices)

выход:

[4, 8]
avatar
jpp
8 апреля 2018 в 00:15
2

Если вы согласны использовать стороннюю библиотеку, numpy предоставляет один из способов:

import numpy as np

a = np.array([0, 1, 1, 0, 0, 0, 1, 0, 1])
b = np.array([0, 1, 1, 0, 1, 0, 1, 0, 0])

res = np.where(a != b)[0]

# array([4, 8], dtype=int64)

Релевантно: Почему NumPy вместо списков Python?

avatar
Peter Y.
7 апреля 2018 в 22:00
2

Вы также можете просто использовать простой цикл, который сканирует списки, элемент за элементом:

a = [0, 1, 1, 0, 0, 0, 1, 0, 1]
b = [0, 1, 1, 0, 1, 0, 1, 0, 0]

diff=[]

for i in range(0,len(a)):
    if a[i]!=b[i]:
        diff.append(i)

print diff

То же самое может делать и понимание списка:

diff=[i for i in range(len(a)) if a[i]!=b[i]]
print diff
Aran-Fey
7 апреля 2018 в 22:08
1

range(0,len(a)) можно упростить до range(len(a))

avatar
Aran-Fey
7 апреля 2018 в 21:55
4

Использование zip zip Перемешать во время обеих списков в одно и то же время и <282433157272752> Чтобы получить индексы во время итерации, и написать Понимание списка который отфильтровывает индексы, в которых значения списка не совпадают:

>>> [i for i, (x, y) in enumerate(zip(a, b)) if x != y]
[4, 8]
dfairch
7 апреля 2018 в 22:04
0

PO = [i for i, (x, y) in enumerate(zip(lst1, lst2)) if x!= y] return PO Это всегда возвращает [0] в качестве моего результата, несмотря на то, что списки имеют очевидные различия

Aran-Fey
7 апреля 2018 в 22:05
0

@dfairch Я на 99,999% уверен, что этот код работает правильно. Не могли бы вы поделиться двумя списками, которые вы сравниваете? (Но, честно говоря, я думаю, что более вероятно, что где-то еще в вашей программе скрывается ошибка.)

dfairch
7 апреля 2018 в 22:33
0

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

Aran-Fey
7 апреля 2018 в 22:35
1

@dfairch Это дает [4, 8], как и должно быть. Действительно, где-то в вашем коде должна быть ошибка.