Найдите число 1 с в том же положении в двух массивах

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

  1. Отправьте его в теле, используя любой из POST или PUT.

    URL: http://localhost:3000/api/prices/shopIds

    Body: { shopIds: [1, 2, 3, 4] }

Вы можете получить идентификаторы, например,

const { shopIds } = req.body // shopIds = [1, 2, 3, 4]

или

const shopIds = req.body.shopIds // shopIds = [1, 2, 3, 4]

  1. Если вы хотите использовать GET, то используйте параметр запроса

    URL: POST http://localhost:3000/api/prices/shopIds?ids=1,2,3,4

Здесь вы можете получить идентификаторы в виде строки, а затем преобразовать их в массив,

const ids = req.query.ids.split(','); // ids = [1 ,2, 3, 4]

Если вы все еще хотите использовать его так, как вы упомянули, он уже получен. Используйте этот метод!

Надеюсь, это поможет!

7
задан Anderson Green 4 June 2013 в 02:30
поделиться

6 ответов

A little shorter and hopefully more pythonic way:

>>> 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
19
ответ дан 6 December 2019 в 08:45
поделиться

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

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

int match=0;

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

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

1
ответ дан 6 December 2019 в 08:45
поделиться

Из-за краткости извращения я предлагаю следующее решение:

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
ответ дан 6 December 2019 в 08:45
поделиться

С 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
0
ответ дан 6 December 2019 в 08:45
поделиться

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

Скалярное произведение двух векторов x и y равно sum (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
ответ дан 6 December 2019 в 08:45
поделиться
[A[i]+B[i] for i in range(min([len(A), len(B)]))].count(2)

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

0
ответ дан 6 December 2019 в 08:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: