python находит отличающиеся элементы в списке - PullRequest
2 голосов
/ 28 марта 2012

Я хочу сравнить списки такого рода:

A = [0,1,0,1,0,1,0,0,0,1,0,1,0,1,0]
B = [0,1,0,1,0,0,0,1,0,1,0,1,0,1,0]

и узнайте, чем отличаются элементы. В этом случае он должен возвращать индекс 5 из A и индекс 7 из B. Все остальные элементы одинаковы. Есть ли функция для этого?

лучший, США

Ответы [ 4 ]

4 голосов
/ 28 марта 2012
>>> [index for (_, index) in set(zip(A, xrange(len(A)))) - set(zip(B, xrange(len(B))))]
[5, 7]

Что, черт возьми, это делает?

  1. Сжать список с увеличивающимися числами. Итак, создайте список кортежей, где первое значение - это элемент в списке, а второе - его индекс.
  2. Создайте наборы из каждого, чтобы их можно было сравнить с функциями набора. Кортежи являются неизменяемыми, поэтому их можно хэшировать, поэтому их можно хранить в наборе
  3. Возьмите установленную разницу между двумя
  4. Выберите индекс различных предметов

EDIT

Благодаря комментарию Романа это проще, но делает то же самое.

>>> [index for (index, _) in set(enumerate(A)) - set(enumerate(B))]
[5, 7]

Обратите внимание, что в то время как zip создает список, enumerate создает перечислимый список, который сразу же перечисляется для построения списка. Также он производит кортежи типа (index, value), а не (value, index), как в ответе выше.

1 голос
/ 28 марта 2012

Другой (возможно, более читабельный?) Однострочный:

>>> [index for (index,(a,b)) in enumerate(zip(A,B)) if a!=b]
[5, 7]

Это сначала объединяет списки вместе:

[(0, 0), (1, 1), (0, 0), (1, 1), (0, 0), (1, 0), (0, 0), (0, 1), (0, 0), 
(1, 1), (0, 0), (1, 1), (0, 0), (1, 1), (0, 0)]

А затем прикрепляет индекс к элементам с enumerate() function:

[(0, (0, 0)), (1, (1, 1)), (2, (0, 0)), (3, (1, 1)), (4, (0, 0)), (5, (1, 0)), 
(6, (0, 0)), (7, (0, 1)), (8, (0, 0)), (9, (1, 1)), (10, (0, 0)), (11, (1, 1)), 
(12, (0, 0)), (13, (1, 1)), (14, (0, 0))]

Затем он использует довольно стандартное понимание списка для сравнения элементов и создает список индексов, где элементы не совпадают.

1 голос
/ 28 марта 2012

Что-то вроде этого должно сделать свое дело (не проверено):

[i for i, v in enumerate(zip(A, B)) if sum(v) == 1]

Это вернет список номеров элементов, которые имеют разные значения в каждом списке.иначе, чем в вопросе, то вы можете использовать это:

[i for i, v in enumerate(zip(A, B)) if v[0] != v[1]]
1 голос
/ 28 марта 2012

Вы обязательно хотите однострочник? Потому что в противном случае есть более простой код:

for i in range(len(A)):
    if A[i]!=B[i]:
        print i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...