Если порядок первоначального d
списка не имеет значения, вы можете взять .items()
каждого словаря и превратить его в frozenset()
, который hashable, а затем вы можете преобразовать все это в set()
или frozenset()
, и затем конвертируйте каждый frozenset()
обратно в словарь. Пример -
uniq_d = list(map(dict, frozenset(frozenset(i.items()) for i in d)))
sets()
не позволяют повторяющихся элементов. Хотя вы в конечном итоге потеряете порядок списка. Для Python 2.x list(...)
не требуется, так как map()
возвращает список.
Пример/Demo -
>>> import pprint
>>> pprint.pprint(d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
{'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150},
{'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110},
{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 150}]
>>> uniq_d = list(map(dict, frozenset(frozenset(i.items()) for i in d)))
>>> pprint.pprint(uniq_d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100},
{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 150},
{'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110},
{'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150}]
Для нового требования -
Однако, что если у меня есть еще один feature_d, но я только хочу DeDup feature_a, _b и _c
Если две записи, имеющие одну и ту же функцию_a, _b и _c, они считаются одинаковыми и дублируется, независимо от того, что не находится в feature_d
Простой способ сделать это состоит в использовании набора и новый список, добавить только те функции, необходимые для набора, и проверьте использование только тех функций, которые вам нужны.Пример -
seen_set = set()
new_d = []
for i in d:
if tuple([i['feature_a'],i['feature_b'],i['feature_c']]) not in seen_set:
new_d.append(i)
seen_set.add(tuple([i['feature_a'],i['feature_b'],i['feature_c']]))
Пример/Demo -
>>> d = [{'feature_a':1, 'feature_b':'Jul', 'feature_c':100, 'feature_d':'A'},
... {'feature_a':2, 'feature_b':'Jul', 'feature_c':150, 'feature_d': 'B'},
... {'feature_a':1, 'feature_b':'Mar', 'feature_c':110, 'feature_d':'F'},
... {'feature_a':1, 'feature_b':'Mar', 'feature_c':110, 'feature_d':'G'}]
>>> seen_set = set()
>>> new_d = []
>>> for i in d:
... if tuple([i['feature_a'],i['feature_b'],i['feature_c']]) not in seen_set:
... new_d.append(i)
... seen_set.add(tuple([i['feature_a'],i['feature_b'],i['feature_c']]))
...
>>> pprint.pprint(new_d)
[{'feature_a': 1, 'feature_b': 'Jul', 'feature_c': 100, 'feature_d': 'A'},
{'feature_a': 2, 'feature_b': 'Jul', 'feature_c': 150, 'feature_d': 'B'},
{'feature_a': 1, 'feature_b': 'Mar', 'feature_c': 110, 'feature_d': 'F'}]
Это звучит, как вы используете неправильную раскладку. Почему бы не иметь словарь, где ключи являются функциями, а значения «установлены?»? – rlbond