2015-01-18 2 views
1

У меня есть функция, такая, что есть словарь как параметры, со значением, которое является целым числом. Я пытаюсь удалить минимальный элемент (ы) и вернуть набор оставшихся ключей.Удалить наименьший элемент (ы) из словаря

Я программирую на питоне. Кажется, я не могу удалить пары ключевых значений с тем же ключом или значениями. Мой код не работает на 2-й и 3-й пример Вот как это будет работать:

remaining({A: 1, B: 2, C: 2}) 
{B, C} 

remaining({B: 2, C : 2}) 
{} 
remaining({A: 1, B: 1, C: 1, D: 4}) 
{D} 

Это то, что у меня есть:

def remaining(d : {str:int}) -> {str}: 
    Remaining = set(d) 
    Remaining.remove(min(d, key=d.get)) 
    return Remaining 
+0

Вы забыли соответствующий тег для языка программирования. Также вы забыли указать, в чем проблема, вы получаете сообщение об ошибке? где вы застряли? – alfasin

+0

Python! Я застрял на удалении пар ключей, где значения одинаковы. Примеры 2 и 3 в описании - это то, где у меня возникают проблемы –

ответ

2

Один подход заключается в минимальное значение, а затем построить список ключей, которые равны он и использует dict.viewkeys(), который имеет поведение типа установки и удаляет ключи, соответствующие минимальному значению.

d = {'A': 1, 'B': 1, 'C': 1, 'D': 4} 

# Use .values() and .keys() and .items() for Python 3.x 
min_val = min(d.itervalues()) 
remaining = d.viewkeys() - (k for k, v in d.iteritems() if v == min_val) 
# set(['D']) 

На стороне записки, я нахожу это странным, что {B: 2, C : 2} должно быть {}, как есть на самом деле не что-то больше для тех, кто будет минимальным, как это было.

+0

[Довольно точно, что это 3 из синтаксиса аннотации.] – DSM

+0

@DSM Я как бы замалчивал этот бит ... не уверен '' {str: int} 'выглядит совершенно правильно ... но на самом деле у меня не было причин обоим с аннотациями до сих пор (если мне это нужно, документы там ...) –

0

Это потому, что вы пытаетесь отобразить значения для ключей и карта позволяет различным клавишам иметь одинаковые значения, но не наоборот. вы должны реализовать «разворот» карты, как описано here, удалить минимальный ключ, а затем вернуть карту обратно в исходную форму.

from collections import defaultdict 

# your example 
l = {'A': 1, 'B': 1, 'C': 1, 'D': 4} 

# reverse the dict 
d1 = {} 
for k, v in l.iteritems(): 
    d1[v] = d1.get(v, []) + [k] 

# remove the min element 
del d1[min(d1, key=d1.get)] 

#recover the rest to the original dict minus the min 
res = {} 
for k, v in d1.iteritems(): 
    for e in v: 
     res[e] = k 

print res 

Комментарий: решение
@ Джон Клементса является более элегантным и должен быть принят в качестве ответа

0

Это удаляет все предметы с минимальным значением.

import copy 

def remaining(dic): 
    minimum = min([i for i in dic.values()]) 
    for k, v in copy.copy(dic.items()): 
     if v == minimum: dic.pop(k) 

    return set(dic.keys()) 
+0

OP хочет набор() со всеми ключами, но те, значение которых является минимальным. – Fernando

+0

Хорошо, я исправил его. –

+0

Вы не можете изменить размер dict, пока вы его итерации. 'dict.pop()' внутри этого 'for' reises' RuntimeError: словарь изменен размер во время итерации' – Fernando

0

Возьмите минимальное значение и построить набор со всеми ключами, которые не связаны с этим значением:

def remaining(d): 
    m = min(d.values()) 
    return {k for k,v in d.items() if v != m} 

Если вам не нравится набор постижений, что это то же самое, как:

def remaining(d): 
    m = min(d.values()) 
    s = set() 
    for k,v in d.items(): 
     if v != m: 
      s.add(k) 
    return s 
Смежные вопросы