Как переписать этот словарь для цикла в Python? - PullRequest
0 голосов
/ 04 августа 2010

У меня есть словарь классов, где классы содержат атрибуты, которые являются списками строк.

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

def find_max_var_amt(some_person) #pass in a patient id number, get back their max number of variables for a type of variable
    max_vars=0
    for key, value in patients[some_person].__dict__.items():
        challenger=len(value)
        if max_vars < challenger:
            max_vars= challenger
    return max_vars

Я хочу переписать его, чтобы мне не приходилось использовать функцию .iteritems (). Эта find_max_var_amt функция работает нормально как есть, но я преобразовываю свой код из словаря в базу данных с помощью модуля dbm, поэтому типичные функции словаря больше не будут работать для меня, даже если синтаксис для назначения и доступа к ключу: пары значений будут одинаковыми. Спасибо за вашу помощь!

1 Ответ

2 голосов
/ 04 августа 2010

Поскольку dbm не позволяет вам перебирать значения напрямую, вы можете перебирать ключи. Для этого вы можете изменить цикл for так, чтобы он выглядел как

for key in patients[some_person].__dict__:
    value = patients[some_person].__dict__[key]
    # then continue as before

Я думаю, что более серьезной проблемой будет тот факт, что dbm хранит только строки. Таким образом, вы не сможете сохранить список непосредственно в базе данных; вам придется хранить строковое представление этого. А это значит, что при попытке вычислить длину списка это будет не так просто, как len(value); вам придется разработать некоторый код, чтобы выяснить длину списка на основе того, какое строковое представление вы используете. Это может быть так просто, как len(the_string.split(',')), просто знайте, что вы должны это сделать.

Кстати, ваша существующая функция может быть переписана с использованием генератора, например так:

def find_max_var_amt(some_person):
    return max(len(value) for value in patients[some_person].__dict__.itervalues())

и если бы вы сделали это таким образом, переход на итерации по ключам выглядел бы как

def find_max_var_amt(some_person):
    dct = patients[some_person].__dict__
    return max(len(dct[key]) for key in dct)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...