from collections import Counter
class Solution:
def singleNumber(self, nums):
single=set(nums)
my_list_tek=list(single)
z=[a for a in nums if not a in my_list_tek or my_list_tek.remove(a)]
return [i for i in nums if not i in z]
def test1(data):
return [x for x in range(len(data)) if data[x] not in data[:x] + data[x + 1:]]
def test2(data):
return Solution().singleNumber(data)
def test3(data):
d = Counter(data)
return [k for k, v in d.items() if v == 1]
Посмотрим, как они работают:
>>> in_data = [1,2,1,3,2,5]
>>> timeit.timeit("test1(in_data)", setup="from __main__ import test1, in_data", number=100000)
0.2761846099997456
>>> timeit.timeit("test2(in_data)", setup="from __main__ import test2, in_data", number=100000)
0.2404884940001466
>>> timeit.timeit("test3(in_data)", setup="from __main__ import test3, in_data", number=100000)
0.45264831800022876
Хм, похоже, вы не слишком медлительны, и этот метод Counter просто ужасен. Давайте попробуем с большим количеством данных (возможно, использование Counter наверстает упущенное).
>>> in_data = [6, 93, 66, 34, 79, 3, 56, 92, 75, 6, 35, 2, 2, 59, 94, 61, 29, 97, 99, 58, 42, 99, 74, 94, 93, 98, 76, 73, 78, 42, 60, 68, 58, 70, 36, 16, 11, 43, 16, 47, 5, 79, 66, 28, 89, 41, 50, 16, 81, 23, 45, 4, 19, 91, 51, 33, 22, 24, 77, 42, 64, 20, 76, 71, 38, 5, 45, 14, 85, 93, 28, 11, 47, 89, 83, 85, 12, 89, 74, 29, 57, 51, 74, 84, 86, 84, 63, 86, 60, 68, 31, 35, 60, 53, 72, 49, 80, 69, 66, 44]
>>> timeit.timeit("test1(in_data)", setup="from __main__ import test1, in_data", number=10000)
2.0650007710000864
>>> timeit.timeit("test2(in_data)", setup="from __main__ import test2, in_data", number=10000)
0.9076229890001741
>>> timeit.timeit("test3(in_data)", setup="from __main__ import test3, in_data", number=10000)
0.14566440800035707
Почему да, действительно так и есть.