45

我收到错误

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。

4

3 回答 3

57

filter()在 python 3 中返回一个列表,而是一个可迭代 filter的对象。使用它上面的 next()函数来获取第一个过滤的项目:

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

无需将其转换为列表,因为您只使用第一个值。

可迭代的对象,如按需filter()产生结果,而不是一次性产生结果。如果您的列表非常大,将所有过滤后的结果放入列表中可能需要很长时间和大量内存,但只需要评估您的条件,直到其中一个值产生结果以产生一个输出。你告诉对象通过将它传递给函数来扫描第一个值。您可以多次这样做以获取多个值,或者使用其他可迭代的工具来完成更复杂的事情;图书馆里到处都是这样的工具。Python循环sheetfilter()lambdasheetTruefilter()sheetnext()itertoolsfor是另一个这样的工具,它也一个接一个地从可迭代中获取值。

如果您必须同时访问所有过滤结果,因为您必须随意索引结果(例如,因为这次您的算法需要访问索引 223、索引 17 和索引 42),然后才将可迭代对象转换为一个列表,通过使用list()

image = list(filter(lambda i: ..., sheet))

访问有序值序列的任何值的能力称为随机访问;alist就是这样一个序列,atuple或 numpy 数组也是如此。Iterables提供随机访问。

于 2013-04-08T09:59:24.213 回答
37

list在条件之前使用filter它可以正常工作。对我来说,它解决了这个问题。

例如

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

代替

filter(lambda x: x%2!=0, mylist)
于 2018-03-10T18:35:00.333 回答
2
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))
于 2016-06-25T17:16:11.020 回答