【问题标题】:How to rewrite this Dictionary For Loop in Python?如何在 Python 中重写这个 Dictionary For Loop?
【发布时间】:2010-08-04 18:42:16
【问题描述】:

我有一个类字典,其中类包含字符串列表的属性。

我创建了这个函数来找出某个特定人的列表中的最大项目数。

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 模块的数据库,因此即使分配和访问密钥的语法对我来说典型的字典函数也不再适用:值对将是相同的。感谢您的帮助!

【问题讨论】:

  • 啊!我的眼睛……应该……修复……识别。 (让它有点难以阅读)
  • 也许专家知道你提供了什么,但最好是一些示例数据,让你的代码运行并看到它的实际效果。必须说我觉得你的代码很奇怪,但我还没有融入类 dict mangling。我觉得很奇怪你传入的是 id_number 而不是 object。

标签: python dictionary for-loop


【解决方案1】:

由于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)

【讨论】:

  • vars(patients[some_person])__dict__ 更易于使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多