Python:在循环中解包元组

时间:2015-06-03 13:37:27

标签: python python-2.7

我被一个看似良性的编程错误所困扰,但遗憾的是我不理解其中的原因。

我迭代地构造一个字典。每个元素都包含一个元组列表。负责任的代码如下:

# ...
for string, integer in another_dict[document_name]:
        new_dict[document_name].append((integer * other_integers[string][1], other_integers[string][0]))

稍后我想阅读new_dict

sorted_list = sorted(new_dict[document_name], key=operator.itemgetter(1))

for t1, t2 in sorted_list:
    file_content += str(t1) + ":" + str(t2) + "|"

这有效一段时间,但最终导致'float'对象没有属性'__getitem 错误。我知道其含义:sorted_list中必须有一个项目在t1和t2中无法取消。奇怪的是,我可以确保sorted_list中的每个项目都是一个元组:

for item in sorted_list:
     if not isinstance(item, tuple):
           print "culprit was found: " + item # was never printed

我甚至打印了sorted_list来手动检查内容,但这似乎是不可能的,因为有数以千计的元素。

最后我写了这个:

for item in sorted_list:
        file_content += str(item[0]) + ":" + str(item[1]) + "|"

一切都像发条一样。为什么?这不相同吗?有人知道这个错误的根源吗?

1 个答案:

答案 0 :(得分:0)

我认为您的数据在测试之间发生了变化:

根据你的说法,'float' object has no attribute '__getitem表示:

There must be an item in sorted_list that cannot be unpaced in t1 and t2. Bizarrely I could ensure that each item in sorted_list is a tuple

我不同意,如果错误来自试图影响float int t1和t2的错误,那么错误将是TypeError: 'float' object is not iterable

代码中唯一可能调用__getitem的其他部分是itemgetter。

所以你的错误似乎是:

$ cat miss.py
#!/usr/bin/env python

import operator

document_name = 0
new_dict = {document_name: [.1]}

sorted_list = sorted(new_dict[document_name], key=operator.itemgetter(1))

for t1, t2 in sorted_list:
    print(str(t1) + ":" + str(t2) + "|")

试验:

$ python miss.py 
Traceback (most recent call last):
  File "miss.py", line 8, in <module>
    sorted_list = sorted(new_dict[document_name], key=operator.itemgetter(1))
TypeError: 'float' object has no attribute '__getitem__'

TL; DR:在new_dict[document_name].append((integer * other_integers[string][1], other_integers[string][0]))

之前,new_dict中有一个数组中的浮点数(而不是数组中的元组)

您可能在REPL中测试过并重新使用已填充的#34; new_dict&#34; ?