Какой самый быстрый способ найти значение, которое появляется только один раз в списке? - PullRequest
0 голосов
/ 04 апреля 2020

Я пытался использовать

nums = [#10000 items of type int]
arr = numpy.array(nums)
for value,count for collections.Counter(arr).items():
   if count == 1:
       return value

, но это слишком медленно. Есть ли более быстрый способ решить эту проблему.

время 200 мс

Ответы [ 2 ]

3 голосов
/ 04 апреля 2020

Я получил это, используя np.unique(..., return_counts=True):

import numpy as np

# Synthesise array...
arr = np.random.randint(0,8, (10000), np.int32)

# ... with one unique value
arr[5000] = 9

А теперь время код:

%%timeit  
...: v,c = np.unique(arr, return_counts=True) 
...: np.argwhere(c==1) 

164 µs ± 672 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

Массив c выглядит так:

array([1284, 1224, 1311, 1185, 1207, 1278, 1233, 1277,    1])

и индекс уникального значения:

np.argwhere(c==1)                                                                                                                               
Out[62]: array([[8]])
0 голосов
/ 04 апреля 2020

Вы можете создать обратный словарь на основе частоты

import numpy as np
import collections

nums=np.random.randint(2,100,10000)
nums[np.random.randint(0,10000-1)]=1 # set a unique value with one
freq = collections.Counter(nums) # get frequencies
revFreq = {v: k for k, v in freq.items()} # reverse the dictionary so each frequency points to its value

revFreq[1] # get the value that appeared one time
1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...