Найти - Пользователи
Полная версия: Про поиск дубликатов в списке. Оцените pls.
Начало » Python для новичков » Про поиск дубликатов в списке. Оцените pls.
1
AxaRu
Это основополагающая задача для любого языка программирования. Поскольку изучать 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?
Заранее благодарю всех.
py.user.next
>>> 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]}
>>>
AxaRu
Спасибо, с enumerate(seq) разобрался.
Поясните пожалуйста смысл
d[k] = [i]
и чем оно лучше
d.update({k, y})[/code]
py.user.next
AxaRu
Поясните пожалуйста смысл
Ключу k в словаре d присвоить список с элементом i.
Это обычная операция добавления ключа в словарь.

AxaRu
и чем оно лучше
dict.update() используется для обновления множества ключей сразу.
AxaRu
Ага, спасибо, разобрался.
Еще вместо
d[k].append(i)
можно сделать так
d[k] += [i]
И получится вот что:
        if k in d:
...             d[k] += [i]
...         else:
...             d[k] = [i]
...     return d
Красиво. Но, на первый взгляд, совсем непонятно.
py.user.next
AxaRu
Еще вместо
Не, append() лучше, так как с ним новый список не создаётся.

>>> import timeit
>>> 
>>> timeit.timeit('[1, 2, 3] + [1]')
0.37027641799795674
>>> timeit.timeit('[1, 2, 3].append(1)')
0.30157291700015776
>>>
AxaRu
Да… на 20% быстрее. Круто.
Спасибо огромное.
Shaman
py.user.next
if k in d: … d.append(i) … else: … d =
d.setdefault(k, []).append(i)
py.user.next
Shaman
d.setdefault(k, []).append(i)
Да, забыл про setdefault(), но всё равно не стал бы через него делать, так как в общем случае в if'е можно сделать больше всяких действий.

if k in d:
    d[k + 1].append(i * 2)
else:
    d[k * 2] = [i + 1]
doza_and
AxaRu
Это основополагающая задача для любого языка
Основы встроены в язык. см groupby, counter
https://docs.python.org/2/library/itertools.html
https://docs.python.org/2/library/collections.html
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB