2015-08-03 4 views
2

У меня есть список словарей в Python, который выглядит следующим образом:Как сделать значения в списке словаря уникальными?

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, _b и _c уникальным.

Например, если у нас есть 3 записи, которые имеют те же feature_a и _b, но имеют три различных значения feature_c100, 100, 150, то после операции, она должна быть 100 и 150.

Как я могу это достичь?

==================================================================================================================================== ============================ ОБНОВЛЕНИЕ:

ОК, спасибо за отличный ответ Ананда, он отлично работает. Однако у меня есть еще один вопрос.

Предположим, что у нас есть новый feature_d и словарь выглядит следующим образом:

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, _b и _c, но оставить feature_d вне. Как я могу это достичь?

Большое спасибо.

+5

Это звучит, как вы используете неправильную раскладку. Почему бы не иметь словарь, где ключи являются функциями, а значения «установлены?»? – rlbond

ответ

2

Если порядок первоначального 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'}] 
+0

Привет, Ананд, Спасибо за ваш ответ, он отлично работает. Однако, что, если у меня есть другой 'feature_d', но я хочу только дедуктировать' feature_a', '_b' и' _c'? Большое спасибо. – ChangeMyName

+0

Можете ли вы обновить вопрос с помощью примерного словаря для этого? –

+0

Привет, Ананд, я только что обновил свой вопрос. Благодарю. – ChangeMyName

Смежные вопросы