gpt4 book ai didi

python - 在python中使用__getitem__迭代字典

转载 作者:行者123 更新时间:2023-12-03 16:42:54 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





How do I use __getitem__ and __iter__ and return values from a dictionary?

(5 个回答)


去年关闭。




我已经实现了一个 python 类来生成数据,如下所示:

class Array:
def __init__(self):
self.arr = [1,2,3,4,5,6,7,8]

def __getitem__(self,key):
return self.arr[key]

a = Array()
for i in a:
print(i, end = " ")

它按预期运行,我得到了关注
1 2 3 4 5 6 7 8

但是,我想对字典做同样的事情。为什么我不能像这样迭代字典?
class Dictionary:
def __init__(self):
self.dictionary = {'a' : 1, 'b' : 2, 'c': 3}

def __getitem__(self,key):
return self.dictionary[key]
d = Dictionary()
for key in d:
print(key, d[key], end=" ")

我希望以下输出
a 1 b 2 c 3

但是当我运行上面的代码时,出现以下错误:
Traceback (most recent call last):

File "<ipython-input-33-4547779db7ec>", line 8, in <module>
for key in d:

File "<ipython-input-33-4547779db7ec>", line 6, in __getitem__
return self.dictionary[key]

KeyError: 0

我们可以像这样迭代普通字典: for key in d .这将迭代所有键,是否不可能使用 __getitem__() 像这样迭代? ?

最佳答案

一个 for循环与迭代器一起使用,您可以传递给 next 的对象.如果对象具有 __next__,则该对象是迭代器方法。

你的两个类都没有,所以 Python 会首先将你的对象传递给 iter得到一个迭代器。第一件事iter试图做的是调用对象的 __iter__方法。

您的两个类都没有定义 __iter__ ,或者,所以 iter next 检查它的对象是否定义了 __getitem__ .你的两个类(class)都这样做,所以 iter返回 iterator 类型的对象,其 __next__方法可以想象成是这样的

def __next__(self):
try:
rv = self.thing.__getitem__(self.i)
except IndexError:
raise StopIteration
self.i += 1
return rv

(迭代器持有对定义 __getitem__ 的事物的引用,以及 i 的值以跟踪对 __next__ 的调用之间的状态。假定 i 被初始化为 0。)

对于 Array ,这是有效的,因为它具有整数索引。对于 Dictionary不过, 0不是键,而不是引发 IndexError ,你会得到一个 KeyError__next__方法没有捕获。

(这是在 documentation for __getitem__ 中提到的:

Note for loops expect that an IndexError will be raised for illegal indexes to allow proper detection of the end of the sequence.



)

使您的 Dictionary可迭代类,定义 __iter__
class Dictionary:
def __init__(self):
self.dictionary = {'a' : 1, 'b' : 2, 'c': 3}

def __getitem__(self,key):
return self.dictionary[key]

def __iter__(self):
return iter(self.dictionary)
dict.__iter__返回 dict_keyiterator 类型的值,这就是产生 dict 的东西的键,可以与 Dictionary.__getitem__ 一起使用.

关于python - 在python中使用__getitem__迭代字典,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61657240/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com