我被一个看似良性的编程错误所困扰,但遗憾的是我不理解其中的原因。
我迭代地构造一个字典。每个元素都包含一个元组列表。负责任的代码如下:
# ...
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]) + "|"
一切都像发条一样。为什么?这不相同吗?有人知道这个错误的根源吗?
答案 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]))
您可能在REPL中测试过并重新使用已填充的#34; new_dict&#34; ?