类型错误:“过滤器”对象不是标化(TypeError: 'filter' objec

2019-08-20 07:00发布

我收到错误

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 3.3.1 IDLE。

Answer 1:

filter()在Python 3 不会返回一个列表,而是一个迭代filter对象。 调用next()在其上,以获得第一过滤项:

bond[bond_index] = old_to_new[sheet.index(next(image)) + 1 ]

没有必要将其转换为一个列表,你只使用第一个值。



Answer 2:

使用list之前filter condtion然后正常工作。 对于我来说,解决了这个问题。

例如

list(filter(lambda x: x%2!=0, mylist))

代替

filter(lambda x: x%2!=0, mylist)


Answer 3:

image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))


文章来源: TypeError: 'filter' object is not subscriptable