Уведомления

Группа в Telegram: @pythonsu

#1 Май 11, 2015 08:11:22

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

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

Есть класс Thing список вещей.
в классе определены названия вещей (список строк, из примера убрал) и _thingCrc - свертки строк, чтобы работало побыстрей. (Я в примере присвоил им значения, чтоб не захламлять лишним кодом.)
Мне нужно найти дубликаты.

Результат поиска записывается в словарь, где
ключ - элемент списка _thingCrc, а
значение - список индексов ключа в списке _thingCrc.
например

{11111 : [0, 5], 121212 : [1], 321321 : [2, 3, 4]}

Я написал такой вот код.
class Thing():
    _thingCrc = [11111, 121212, 321321, 321321, 321321, 11111]
    _thingDup = {}      # словарь со списком дубликатов. 	
				# имеет следующий вид:
				# key : [index_1<, index_N>], где
				# кеу - элемент списка _thingHash
				# index_N - индекс элемента key в списке _thingHash
    def findDup(self):
        for x in range(0, len(self._thingCrc)):
            y = self._thingCrc[x]
            if y in self._thingDup:
                self._thingDup[y].append(x)
            else:
                self._thingDup.update({y : [x]})
        print(self._thingDup)

Как он оценивается с точки зрения хорошей практики python?
Заранее благодарю всех.

Отредактировано AxaRu (Май 11, 2015 08:20:57)

Офлайн

#2 Май 11, 2015 09:01:26

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

>>> def f(seq):
...     d = {}
...     for i, k in enumerate(seq):
...         if k in d:
...             d[k].append(i)
...         else:
...             d[k] = [i]
...     return d
... 
>>> lst = [11111, 121212, 321321, 321321, 321321, 11111]
>>> f(lst)
{321321: [2, 3, 4], 121212: [1], 11111: [0, 5]}
>>> f(lst * 2)
{321321: [2, 3, 4, 8, 9, 10], 121212: [1, 7], 11111: [0, 5, 6, 11]}
>>>



Отредактировано py.user.next (Май 11, 2015 09:03:22)

Офлайн

#3 Май 11, 2015 09:39:18

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

Спасибо, с enumerate(seq) разобрался.
Поясните пожалуйста смысл

d[k] = [i]
и чем оно лучше
d.update({k, y})[/code]

Отредактировано AxaRu (Май 11, 2015 10:11:20)

Офлайн

#4 Май 11, 2015 10:08:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

AxaRu
Поясните пожалуйста смысл
Ключу k в словаре d присвоить список с элементом i.
Это обычная операция добавления ключа в словарь.

AxaRu
и чем оно лучше
dict.update() используется для обновления множества ключей сразу.



Офлайн

#5 Май 11, 2015 10:13:53

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

Ага, спасибо, разобрался.
Еще вместо

d[k].append(i)
можно сделать так
d[k] += [i]
И получится вот что:
        if k in d:
...             d[k] += [i]
...         else:
...             d[k] = [i]
...     return d
Красиво. Но, на первый взгляд, совсем непонятно.

Отредактировано AxaRu (Май 11, 2015 10:19:57)

Офлайн

#6 Май 11, 2015 12:36:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

AxaRu
Еще вместо
Не, append() лучше, так как с ним новый список не создаётся.

>>> import timeit
>>> 
>>> timeit.timeit('[1, 2, 3] + [1]')
0.37027641799795674
>>> timeit.timeit('[1, 2, 3].append(1)')
0.30157291700015776
>>>



Офлайн

#7 Май 11, 2015 18:55:19

AxaRu
Зарегистрирован: 2015-04-11
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

Да… на 20% быстрее. Круто.
Спасибо огромное.

Отредактировано AxaRu (Май 11, 2015 18:57:11)

Офлайн

#8 Май 11, 2015 23:56:42

Shaman
Зарегистрирован: 2013-03-15
Сообщения: 1369
Репутация: +  88  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

py.user.next
if k in d: … d.append(i) … else: … d =
d.setdefault(k, []).append(i)

Офлайн

#9 Май 12, 2015 01:13:15

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

Shaman
d.setdefault(k, []).append(i)
Да, забыл про setdefault(), но всё равно не стал бы через него делать, так как в общем случае в if'е можно сделать больше всяких действий.

if k in d:
    d[k + 1].append(i * 2)
else:
    d[k * 2] = [i + 1]



Отредактировано py.user.next (Май 12, 2015 01:15:31)

Офлайн

#10 Май 12, 2015 08:53:38

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Про поиск дубликатов в списке. Оцените pls.

AxaRu
Это основополагающая задача для любого языка
Основы встроены в язык. см groupby, counter
https://docs.python.org/2/library/itertools.html
https://docs.python.org/2/library/collections.html



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version