Как я могу сделать свой код Python на Leetcode быстрее? - PullRequest
0 голосов
/ 07 ноября 2018

Проблема: Дан массив чисел nums, в котором ровно два элемента появляются только один раз, а все остальные элементы появляются ровно дважды. Найдите два элемента, которые появляются только один раз. Пример:

Input:  [1,2,1,3,2,5]
Output: [3,5]

Это мой код:

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]

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018
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

Почему да, действительно так и есть.

0 голосов
/ 07 ноября 2018
dta = [1,2,1,3,2,5]
ctr = Counter(dta).most_common()
least2, least1 = ctr.pop(), ctr.pop()
print(least1[0], least2[0])

Несмотря на то, что полезные коллекции и itertools приведены в абстрактном виде, я не нашел их лучше, чем «сворачивать свои собственные», когда у вас есть предметно-ориентированные знания.

0 голосов
/ 07 ноября 2018

Используйте Counter со списком для ускорения:

from collections import Counter
d = Counter([1,2,1,3,2,5])
[k for k,v in d.items() if v==1]

[3, 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...