【问题标题】:Iterate over dictionary of objects遍历对象字典
【发布时间】:2015-09-09 12:34:16
【问题描述】:

我有一个对象字典,其中包含电子表格中的“名称/范围”。在处理电子表格时,我需要更新与范围关联的值。

保存此信息的类如下所示:

class varName:
    name = None
    refersTo = None
    refersToR1C1 = None
    value = None
    def __init__(self, name, refersTo, refersToR1C1, value):
        self.name = name
        self.refersTo = refersTo
        self.refersToR1C1 = refersToR1C1
        self.value = value

我按如下方式创建字典:

staticNames = {}
wbNames = wb.Names
for name in wbNames:
    (nSheet, nAddr) = name.RefersTo.split("!") 
    print "Name:  %s    Refers to:  %s    Refers to R1C1:  %s       Value:  %s  " % (name.Name, name.RefersTo, name.RefersToR1C1, wSheets(nSheet.replace('=', '')).Range(nAddr).value) 
    staticNames[name.Name] = varName(name.Name, name.RefersTo, name.RefersToR1C1, wSheets(nSheet.replace('=', '') ).Range(nAddr).value)

它似乎工作正常。我可以在调试中看到字典和包含的对象。当我回去根据处理电子表格更新字典中的对象时,我迷路了。 我称这个函数为:

def updateStaticNames(ws, r, c, val_in, staticNames):
    for sName in staticNames:
        if sName.refersToR1C1() == "=" + ws.Name + "!R" + str(r) + "C" + str(c):
            sName.value = val_in          
    return None      

staticNames 指的是包含名称/范围对象的字典。 我期待sName 包含varName 类型的对象。但可惜它包含一个字符串。我做错了什么?

【问题讨论】:

  • for sName in staticNames: 迭代 keys(它是字典,而不是列表),所以 sName 将是 name.Name 的任何内容...

标签: python loops dictionary object


【解决方案1】:

for foo in some_dict 遍历字典的,而不是它的值。

d = {'a': 1, 'b': 2, 'c': 3}
for dd in d:
    print(dd)
# gives a; b; c

你可能想做for foo in some_dict.values()

for dd in d.values():
    print(dd)
# gives 1; 2; 3

【讨论】:

  • 如果你需要键和值,pythonic的方法是使用iteritems 例如:for k, v in d.iteritems(): d[k].refersToR1C1 = "somevalue"
  • @Ivanhoe 对,但在 OP 的代码中,他从不需要密钥,只需要值。
  • 是的,它给了我钥匙。感谢您的友好帮助。多任务处理就这么多
  • 由于人们仍在关注此问题,因此值得指出的是,艾芬豪的评论不再准确。在现代 Python 中,iteritems 已被 items 取代(for k, v in d.items(): print(k, v)a 1; b 2; c 3
猜你喜欢
  • 2013-01-21
  • 2017-05-06
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
相关资源
最近更新 更多