Найти количество единиц в одной позиции в двух массивах - PullRequest
7 голосов
/ 18 мая 2009

У меня есть два списка:

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

Я хочу найти число 1 в одной и той же позиции в обоих списках.

Ответ для этих массивов будет 2.

Ответы [ 7 ]

19 голосов
/ 18 мая 2009

Немного короче и, надеюсь, более питоническим способом:

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

x = sum(1 for a,b in zip(A,B) if (a==b==1))
>>> x
2
2 голосов
/ 18 мая 2009

Чуть более короткая вариация у Дракоши:

>>> A = [0,0,0,1,0,1]
>>> B = [0,0,1,1,1,1] 
>>> sum(a*b for a, b in zip(A, B) )
2
1 голос
/ 18 мая 2009

По мотивам краткости нужно извращаться, я предлагаю следующее решение:

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

print len(set(i for i, n in enumerate(A) if n == 1) &
          set(i for i, n in enumerate(B) if n == 1))

(Предложение Дракоши является гораздо более разумным способом решения этой проблемы. Это просто показывает, что часто можно взглянуть на одну и ту же проблему по-разному.)

1 голос
/ 18 мая 2009

Я не эксперт по Python, но что не так с простым циклом от начала до конца первого массива?

В C # я бы сделал что-то вроде:

int match=0;

for (int cnt=0; cnt< A.Count;cnt++)
{
    if ((A[cnt]==B[cnt]==1)) match++;
}

Возможно ли это на вашем языке?

0 голосов
/ 18 мая 2009
[A[i]+B[i] for i in range(min([len(A), len(B)]))].count(2)

По сути, это просто создает новый список, в котором все элементы двух других добавлены вместе. Вы знаете, что были две 1, если сумма равна 2 (при условии, что в списке только 0 и 1). Поэтому просто выполните операцию подсчета на 2.

0 голосов
/ 18 мая 2009

Вот еще один метод, который использует тот факт, что массив содержит только нули и единицы.

Скалярное произведение двух векторов x и y является суммой (x (i) * y (i)), единственная ситуация, дающая ненулевой результат, если x (i) == y (i) == 1, используя например, numpy

from numpy import *
x = array([0,0,0,1,0,1])
y = array([0,0,1,1,1,1])
print dot(x,y)

просто и красиво. Этот метод делает n умножений и добавляет n-1 раз, однако существуют быстрые реализации, использующие SSE, GPGPU, векторизацию, (добавьте здесь свое причудливое слово) для точечных продуктов (скалярных продуктов)

Я сравнил метод numpy с этим методом:

sum(1 for a,b in zip(x,y) if (a==b==1))

и обнаружил, что для 1000000 циклов numpy-версия сделала это за 2121 мс, а zip-метод сделал это за 9502 мс, таким образом, numpy-версия намного быстрее

Я сделал лучший анализ эффективности и обнаружил, что для n элементов в массиве метод zip занял t1 мс, а скалярное произведение заняло t2 мс за одно изменение

elements      zip       dot
1          0.0030    0.0207
10         0.0063    0.0230
100        0.0393    0.0476
1000       0.3696    0.2932
10000      7.6144    2.7781
100000   115.8824   30.1305

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

0 голосов
/ 18 мая 2009

С SciPy :

>>> from scipy import array
>>> A=array([0,0,0,1,0,1])
>>> B=array([0,0,1,1,1,1])

>>> A==B
array([ True,  True, False,  True, False,  True], dtype=bool)
>>> sum(A==B)
4

>>> A!=B
array([False, False,  True, False,  True, False], dtype=bool)
>>> sum(A!=B)
2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...