Фильтрация словаря с несколькими ключами и несколькими значениями для каждого ключа

У меня вопрос, как фильтровать словарь с помощью цикла.

Вот пример словаря:

d = {'beta': ['ABC', '1', '5', '10', '15'],
     'lambda': ['DEF', '3', '30', '22.2', '150'],
     'omega': ['RST','15', '54.4', '150', '75']
}

Как мне отфильтровать словарь, чтобы удалить ключи, если третье значение в каждом ключе ‹100? Другими словами, после функции if в словаре нужно оставить только омегу.
Я пробовал:

for k, v in d.iteritems(): 
    r = float((d[key][2]))
    if r < float(100):
        del d[k]

Но не вышло. Есть предположения? Здесь вы новичок в программировании на Python.

Новый словарь должен просто оставить омега-ключ, поскольку 150 больше 100.


person Deuce525    schedule 18.08.2016    source источник
comment
как должен выглядеть выходной список?   -  person user1767754    schedule 18.08.2016
comment
в идеале это было бы как d = {'lambda': 3, 30, 22.2, 150}   -  person Deuce525    schedule 18.08.2016
comment
третье значение, поэтому в основном, поскольку третье значение больше 100, словарь должен содержать только ключ Omega, но поддерживать все значения ключа Omega. Просто мой цикл должен удалить ключи бета и лямбда.   -  person Deuce525    schedule 01.09.2016


Ответы (1)


def cast_values(v):
    try:
        return float(v)
    except ValueError:
        return v

new_d = {k:[ cast_values(i) for i in v ] for k,v in d.items() if float(v[3]) > 100}

Полученные результаты:

new_d = {'omega': ['RST', 15, 54.4, 150, 75]}
person JClarke    schedule 01.09.2016
comment
Jclarke, я думаю, что это работает, но в моей реальной программе, где я пытался применить это, это дает мне синтаксическую ошибку: невозможно преобразовать строку в float. Я думаю, что он обрабатывает значения в ключе как строки, а не значения. Есть идеи, как это исправить? - person Deuce525; 01.09.2016
comment
Если вы по ошибке не передадите ключ вместо значения, вы получите эту ошибку. Я протестировал код с информацией, которую вы предоставили, и не столкнулся с этой проблемой. Убедитесь, что вы передаете правильные значения в float() части кода. - person JClarke; 01.09.2016
comment
ValueError: could not convert string to float: произойдет, если будет передано что-то вроде float('word'), но будет правильно преобразовано float('100') - person JClarke; 01.09.2016
comment
поэтому, посмотрев еще раз, я получаю сообщение об ошибке, потому что значения в моем dict отображаются как «100», как мне удалить «» из числа? Я мог бы сделать это вручную в моем примере, но в моей реальной программе у меня есть тысячи чисел. - person Deuce525; 01.09.2016
comment
Происходит ли это в новом созданном диктате? - person JClarke; 01.09.2016
comment
в моем исходном словаре есть '', я забыл добавить это в пример, поэтому, когда я запускаю ваш синтаксис, он дает мне, что не может преобразовать строку в ошибку с плавающей запятой - person Deuce525; 01.09.2016
comment
Сделал обновление! В следующий раз опубликуйте свои данные в том состоянии, в котором они были, когда вы получили свою ошибку (и) - person JClarke; 01.09.2016
comment
Это работает! благодарю вас! У меня есть последний вопрос: если в моем ключе есть строка, а не только значения для преобразования, есть ли способ сохранить строку в строке? См. Обновленный вопрос выше. Спасибо! - person Deuce525; 01.09.2016
comment
Это сработало! после нескольких изменений в другой части моего кода! - person Deuce525; 02.09.2016