Форум сайта python.su
1
Это основополагающая задача для любого языка программирования. Поскольку изучать 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)
Отредактировано AxaRu (Май 11, 2015 08:20:57)
Офлайн
857
>>> 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)
Офлайн
1
Спасибо, с enumerate(seq) разобрался.Поясните пожалуйста смысл
d[k] = [i]
d.update({k, y})[/code]
Отредактировано AxaRu (Май 11, 2015 10:11:20)
Офлайн
857
AxaRuКлючу k в словаре d присвоить список с элементом i.
Поясните пожалуйста смысл
AxaRudict.update() используется для обновления множества ключей сразу.
и чем оно лучше
Офлайн
1
Ага, спасибо, разобрался.
Еще вместо
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)
Офлайн
857
AxaRuНе, append() лучше, так как с ним новый список не создаётся.
Еще вместо
>>> import timeit >>> >>> timeit.timeit('[1, 2, 3] + [1]') 0.37027641799795674 >>> timeit.timeit('[1, 2, 3].append(1)') 0.30157291700015776 >>>
Офлайн
1
Да… на 20% быстрее. Круто.
Спасибо огромное.
Отредактировано AxaRu (Май 11, 2015 18:57:11)
Офлайн
88
py.user.next
if k in d: … d.append(i) … else: … d =
d.setdefault(k, []).append(i)
Офлайн
857
ShamanДа, забыл про setdefault(), но всё равно не стал бы через него делать, так как в общем случае в if'е можно сделать больше всяких действий.d.setdefault(k, []).append(i)
if k in d: d[k + 1].append(i * 2) else: d[k * 2] = [i + 1]
Отредактировано py.user.next (Май 12, 2015 01:15:31)
Офлайн
253
AxaRuОсновы встроены в язык. см groupby, counter
Это основополагающая задача для любого языка
Офлайн