Python TypeError:对象没有属性'__获取项目';

Python TypeError:对象没有属性'__获取项目';,python,python-2.7,dictionary,Python,Python 2.7,Dictionary,我看过另一篇有这个标题的文章,但我很困惑,因为我的值已经是整数了。我希望脚本查看每个键的值(一个具有多个值的数组),通过将数组设置为列表对数组进行排序,然后迭代经过排序和转换的列表的值,从第二个值中减去第一个值,然后从第三个值减去第二个值,依此类推,将差异存储在列表中 b = {"a":[5,2,1],"b":[8,4,3]} for k in b.values(): eVals = [] #print listVals x = 0 for i in sorte

我看过另一篇有这个标题的文章,但我很困惑,因为我的值已经是整数了。我希望脚本查看每个键的值(一个具有多个值的数组),通过将数组设置为列表对数组进行排序,然后迭代经过排序和转换的列表的值,从第二个值中减去第一个值,然后从第三个值减去第二个值,依此类推,将差异存储在列表中

b = {"a":[5,2,1],"b":[8,4,3]}

for k in b.values():
    eVals = []
    #print listVals
    x = 0
    for i in sorted(k):
        dif = i[x+1] - i[x]
        print dif
        eVals.append(dif)
        x +=1
以下是错误:

Traceback (most recent call last):
  File "C:\Python27\ArcGIS10.2\Lib\site-packages\pythonwin\pywin\framework\scriptutils.py", line 323, in RunScript
    debugger.run(codeObject, __main__.__dict__, start_stepping=0)
  File "C:\Python27\ArcGIS10.2\Lib\site-packages\pythonwin\pywin\debugger\__init__.py", line 60, in run
    _GetCurrentDebugger().run(cmd, globals,locals, start_stepping)
  File "C:\Python27\ArcGIS10.2\Lib\site-packages\pythonwin\pywin\debugger\debugger.py", line 654, in run
    exec cmd in globals, locals
  File "N:\Python\test_dict.py", line 1, in <module>
    b = {"a":[5,2,1],"b":[8,4,3]}
TypeError: 'int' object has no attribute '__getitem__'
回溯(最近一次呼叫最后一次):
文件“C:\Python27\ArcGIS10.2\Lib\site packages\pythonwin\pywin\framework\scriptutils.py”,第323行,在RunScript中
run(codeObject,main,dict,start,stepping=0)
文件“C:\Python27\ArcGIS10.2\Lib\site packages\pythonwin\pywin\debugger\\uuuuu init\uuuu.py”,第60行,正在运行
_GetCurrentDebugger().run(cmd、globals、locals、start_步进)
文件“C:\Python27\ArcGIS10.2\Lib\site packages\pythonwin\pywin\debugger\debugger.py”,第654行,正在运行
全局、局部中的exec cmd
文件“N:\Python\test\u dict.py”,第1行,在
b={“a”:[5,2,1],“b”:[8,4,3]}
TypeError:“int”对象没有属性“\uuuu getitem\uuuu”
如果您可以方便地使用numpy,您可以使用一行代码来完成此操作:

>>> import numpy as np
>>> b = {"a":[5,2,1],"b":[8,4,3]}
>>> {k: np.diff([0] + sorted(v)) for k, v in b.iteritems()}
{'a': array([1, 1, 3]), 'b': array([3, 1, 4])}

您尝试在
int
上使用
\uuuu getitem\uuuu

这里有一个可能的解决方案

inp  = {"a":[5,2,1],"b":[8,4,3]}

out = {}
for key, lis in inp.iteritems():
    difLis = []
    sLis = sorted(lis)
    for i, _ in enumerate(sLis[:-1]):
        dif = sLis[i+1] - sLis[i]
        print "%d - %d = %d" % (sLis[i+1], sLis[i], dif)
        difLis.append(dif)
    out[key] = difLis
print out # {'a': [1, 3], 'b': [1, 4]}

i
是一个整数,您试图像使用
i[x+1]-i[x]
的列表一样访问它。我认为错误消息来自错误的行。
i[x+1]
i[x]
部分会导致该错误,而不是初始dict构造。应该从列表的最后一个值中减去什么?应该如何存储
dif
?这是关于最后一个值的一个好观点。我想我需要加入一个条件。我没有得到输出。我也没有得到你的输出。谢谢Wim。我同意帕斯勒的回答。谢谢你,帕斯勒。在我的生产脚本中,dict是从表中具有一些空值的字段生成的。当减法操作数遇到这个问题时,我得到一个类型错误:“NoneType”。我加入了一个条件“如果我不是None:dif=sLis[I+1]-sLis[I]如果dif>20:”但它仍然存在。我还试图排除将空值添加到键的值中:“行[2]!='0'和int(行[2])%2==0,行[2]不是无:”但仍然得到错误。不过,也许这应该是一篇单独的帖子。我不知道为什么有人对此投了反对票,却没有留下评论——但好吧。@ShaunO是的,这将是一个不同的问题。确保提供运行的代码示例、示例输入和所需的输出。
inp  = {"a":[5,2,1],"b":[8,4,3]}

out = {}
for key, lis in inp.iteritems():
    difLis = []
    sLis = sorted(lis)
    for i, _ in enumerate(sLis[:-1]):
        dif = sLis[i+1] - sLis[i]
        print "%d - %d = %d" % (sLis[i+1], sLis[i], dif)
        difLis.append(dif)
    out[key] = difLis
print out # {'a': [1, 3], 'b': [1, 4]}