Другой вариант - создать собственную структуру данных вместо использования dict. Если вы сделаете это, вы можете переопределить __ cmp __ , __ eq __ и __ hash __ . Это даст вам возможность использовать тип данных «set» во всей его красе.
Вот одна из возможных реализаций, хотя я не даю никаких обещаний относительно качества предоставленной мною процедуры хеширования:
class Thing(object):
def __init__(self, file, line, rule):
self.file = file
self.line = line
self.rule = rule
def __cmp__(self, other):
result = cmp(self.file, other.file)
if result == 0:
result = cmp(self.line, other.line)
if result == 0:
result = cmp(self.rule, other.rule)
return result
def __eq__(self, other):
return cmp(self, other) == 0
def __hash__(self):
return hash(self.file) * hash(self.line) * hash(self.rule)
def __str__(self):
return ', '.join([self.file, self.line, self.rule])
things = [ Thing(u'/file.txt', u'line 666', u'A DUPLICATE RULE'),
Thing(u'/file.txt', u'line 666', u'A DUPLICATE RULE'),
Thing(u'/uniquefile.txt', u'line 999', u'A UNIQUE RULE')]
duplicate_things = set()
unique_things = set()
for t in things:
if t in unique_things:
duplicate_things.add(t)
else:
unique_things.add(t)
Если вам нужно вернуться к списку, просто создайте его из полученного набора:
unique_things = list(unique_things)
duplicate_things = list(duplicate_things)
Это немного больше кода для создания своего собственного класса, подобного этому, но может дать вам другие варианты в будущем, если ваша программа усложняется.
Редактировать
Хорошо, мои руки сегодня быстрее, чем мои глаза, но я думаю, что это редактирование решает проблему, указанную @ nosklo