2013-09-03 2 views
1

Я не был уверен, что это такое, но в основном у меня есть word_set в виде defaultdict [(word, value), ...], который исходил от функции, которая анализировала некоторые необработанные данные.Синтаксис Python: мутация/уменьшение значения defaultdict?

У меня есть другие функции: reduceVal(word_set, min_val), reduceWord(word_set, *args) и т. Д., Который удаляет пары, которые: имеют значение меньше min_val, имеют свое (слово) в [args] соответственно. Все они в значительной степени следуют одной и той же структуре, например.

def reduceVal(word_set, value): 
    "Returns word_set with (k, v) pairs where v > value)" 
    rtn_set = defaultdict() 
    for (k, v) in word_set.items(): 
     if v > value: 
      rtn_set.update({k:v}) 
    return rtn_set 

мне было интересно, если бы был более кратким, или вещий, способ выразить это, без создания нового rtn_set или, может быть, даже определение целой функции

ответ

1

Используйте ДИКТ постижение, defaultdict не здесь требуется:

new_dict = {k:v for k, v in word_set.items() if v > value} 

на py2.x вы должны использовать word_set.iteritems() как он возвращает итератор.

2

Если вы изучаете использование понятий dict, вам не нужно иметь отдельные функции для всех этих разных фильтров. Например, reduceVal и reduceWord могут быть заменены на:

# Python 2.7+ 
{w: v for w, v in word_set.items() if v > value} 
{w: v for w, v in word_set.items() if w in args} 

# Python 2.6 and earlier 
dict((w, v) for w, v in word_set.iteritems() if v > value) 
dict((w, v) for w, v in word_set.iteritems() if w in args)