【问题标题】:Empty value when iterating a dictionary with .iteritems() method使用 .iteritems() 方法迭代字典时的空值
【发布时间】:2013-10-17 15:51:55
【问题描述】:

我在使用字典时遇到了一些奇怪的问题,我正在尝试从字典中迭代对以传递给另一个函数。尽管出于某种原因,迭代器的循环总是返回空值。

代码如下:

  def LinktoCentral(self, linkmethod):
    if linkmethod == 'sim':
        linkworker = Linker.SimilarityLinker()
        matchlist = []

        for k,v in self.ToBeMatchedTable.iteritems():

            matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items()))

现在如果我在 for 循环上方插入一个打印行:

matchlist = []
print self.ToBeMatchedTable.items()        
for k,v in self.ToBeMatchedTable.iteritems():

            matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items()))

我得到了应该在字典中打印的数据。字典的值是列表对象。我在 for 循环上方打印时从字典中得到的一个示例元组:

>>> (1, ['AARP/United Health Care', '8002277789', 'PO Box 740819', 'Atlanta', 'GA','30374-0819', 'Paper', '3676'])

但是,for 循环为 linkworker.GetBestMatch 方法提供了空列表。如果我在 for 循环下方放置一条打印行,我会得到以下结果:

代码:

matchlist = []

        for k,v in self.ToBeMatchedTable.iteritems():
            print self.ToBeMatchedTable.items()
            matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items()))

            ## Place holder for line to send match list to display window
        return matchlist

第一次迭代的结果:

>>> (0, ['', '', '', '', '', '', '', ''])

我真的不知道发生了什么,执行此循环时没有其他任何事情发生。我犯了什么愚蠢的错误?

【问题讨论】:

  • self.ToBeMatchedTable 是如何被填充的?此外, .iteritems() 现在已弃用,应简单地替换为 .items() 例如对于 d.items() 中的 k,v:通过
  • 你能提供一个完整的例子吗?
  • @bcollins 不推荐使用——只是在 Python 3.x 中不需要——它在 2.x 中仍然完全有效,其中切换到 items() 与 Python 3.x 版本完全不同
  • self.ToBeMatchedTable 是通过迭代 CSV 文件来填充的,我确信没有语法错误,但我必须通过我的代码来确认。

标签: python python-2.7 dictionary iterator


【解决方案1】:

假设如下:

d = {1: [1,2,3,4,54,6,7,8]}

print d.items()

for k,v in d.iteritems():
    print k, v

Output:
[(1, [1, 2, 3, 4, 54, 6, 7, 8])]
1 [1, 2, 3, 4, 54, 6, 7, 8]

您的self.ToBeMatchedTable 拥有超过one pair 的键和值 通常Python dictionariesunordered,当您尝试访问它时, 它以随机方式工作

在你的情况下:

有一个像(0, ['', '', '', '', '', '', '', ''])这样的键值对,所以第二次,你得到了这个!

您的代码似乎有问题:

matchlist.append(k, linkworker.GetBestMatch(v, self.CentralDataTable.items()))

我已经模拟了类似于上面那行的东西

>>> l = []
>>> 
>>> l.append(1, 2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: append() takes exactly one argument (2 given)

尝试评论或修改您的matchlist.append(...) 行:

matchlist.append((k, linkworker.GetBestMatch(v, self.CentralDataTable.items())))

【讨论】:

  • 太棒了,谢谢!这就是问题所在,实际上有一堆空集,每次我运行它并且它实际上进入附加行时,它会抛出异常,但它会被打印到命令行的异常掩埋,因为 GetBestMatch 方法不喜欢空“v”的值。
猜你喜欢
  • 2015-07-25
  • 1970-01-01
  • 2011-10-14
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
  • 2017-11-17
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多