我收到错误
TypeError: 'filter' object is not subscriptable
尝试运行以下代码块时
bonds_unique = {}
for bond in bonds_new:
if bond[0] < 0:
ghost_atom = -(bond[0]) - 1
bond_index = 0
elif bond[1] < 0:
ghost_atom = -(bond[1]) - 1
bond_index = 1
else:
bonds_unique[repr(bond)] = bond
continue
if sheet[ghost_atom][1] > r_length or sheet[ghost_atom][1] < 0:
ghost_x = sheet[ghost_atom][0]
ghost_y = sheet[ghost_atom][1] % r_length
image = filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and
abs(i[1] - ghost_y) < 1e-2, sheet)
bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ]
bond.sort()
#print >> stderr, ghost_atom +1, bond[bond_index], image
bonds_unique[repr(bond)] = bond
# Removing duplicate bonds
bonds_unique = sorted(bonds_unique.values())
和
sheet_new = []
bonds_new = []
old_to_new = {}
sheet=[]
bonds=[]
错误发生在
行bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ]
我很抱歉这类问题已多次发布,但我对Python很新,并且不完全理解字典。我试图以不应该使用字典的方式使用字典,还是应该使用不使用字典的字典? 我知道修复可能非常简单(虽然不是我),如果有人能指出我正确的方向,我将非常感激。
如果已经回答了这个问题,我再次道歉
谢谢,
克里斯。
我在Windows 7 64位上使用Python IDLE 3.3.1。
答案 0 :(得分:35)
filter()
不返回一个列表,但是一个可迭代的filter
对象。在其上调用next()
以获取第一个过滤项目:
bond[bond_index] = old_to_new[sheet.index(next(image)) + 1 ]
无需将其转换为列表,因为您只使用第一个值。
答案 1 :(得分:11)
在truffle migrate --reset --compile-all
条件之前使用list
然后它可以正常工作。对我来说,它解决了这个问题。
例如
filter
而不是
list(filter(lambda x: x%2!=0, mylist))
答案 2 :(得分:3)
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))