gpt4 book ai didi

python - 通过 Python 字典元素隐式迭代

转载 作者:行者123 更新时间:2023-12-01 04:01:14 25 4
gpt4 key购买 nike

我试图弄清楚是否有一种隐式的方式来迭代列表元素。示例:对于列表 someList = ['a','b','c'],您无需编写 for 循环来迭代列表打印元素当 print(someList) 执行隐式迭代时。

我有以下(简化的)python 代码:

class foo:
def __init__(self):
self.x=None
self.y=None
self.z=None

def set(self, x, y , z):
self.x = x
self.y = y
self.z = z

def get(self):
return {'x':self.x, 'y':self.y, 'z':self.z}


class bar:
def __init__(self):
self.foos=[]
def add(self, foo):
self.foos.append(foo)
def get(self):
return {'foos':self.foos}

使用

初始化
f = foo()
f.set(1,2,3)

g = foo()
g.set(4,5,6)


h = bar()
h.add(f)
h.add(g)

然后调用

print(f.get())
print(g.get())
print(h.get())

这给出了

{'z': 3, 'x': 1, 'y': 2}
{'z': 6, 'x': 4, 'y': 5}
{'foos': [<__main__.foo object at 0x0000000003541748>, <__main__.foo object at 0x000000000358C630>]}

我最终想要做的是返回一个类似 JSON 的结构或嵌套字典,以便将 foo.get() 方法的返回值包含在对 bar 的调用中。获取()

我意识到该数组不包含实际的 foo 对象(仅对它们的引用)。

我考虑过使用迭代器,就像http://anandology.com/python-practice-book/iterators.html中解释的那样。该示例的问题在于,要迭代的项必须在数据结构内定义(即 foo)。在 bar 类中包含迭代器的问题是 foos 列表可能不是唯一要迭代的集合:我可以添加集合 foos2 >(但为了简单起见没有这样做)

我考虑了Access nested dictionary items via a list of keys?的解决方案,但是 pprint 给了我类似于我自己的代码的东西。我也不确定 reduce 函数的使用是否适用于我的情况。

我还考虑过在 print 函数上进行运算符重载,但我不想得到一个字符串,只是一个易于显示但也易于显示的数据结构导航。

是否有简单的方法正确的方法来做到这一点?我是否使用了正确的数据结构(即我应该使用嵌套列表以外的其他内容)?

我对 Python 还很陌生,所以请保持温柔。

最佳答案

这会在 bar.get() 的返回值中返回 foo.get() 的结果。这就是你所要求的吗?

class bar:
...
def get(self):
return {'foos':[foo.get() for foo in self.foos]}

分解return语句,

return (            # you know what this keyword does
{ # create a dict
'foos': # with a key of "foos",
[ # and a value that is a list
# (in this case, built from a list comprehension)
x.get() # each element is the result of calling .get()
for x in self.foos # on each element of the "foos" list
] # end of list comprehension
} # end of dict
) # end of return expression

因此,return 语句返回一个只有一个键值对的 dict。关键是文字字符串 "foos"。该值是一个列表,由对 self.foos 列表的每个成员调用 .get() 的结果组成。 (我更改了循环变量的名称并添加了括号,以使生活不再那么困惑。)

结果如下:

{'x': 1, 'z': 3, 'y': 2}
{'x': 4, 'z': 6, 'y': 5}
{'foos': [{'x': 1, 'z': 3, 'y': 2}, {'x': 4, 'z': 6, 'y': 5}]}

完全等效的 bar.get() 实现可以使用显式 for 循环,如下所示。我只使用列表理解,因为我发现代码更容易阅读。如果您发现以下内容更容易,请改用它。

def get(self):
result = []
for x in self.foos:
result.append(x.get())
return result

关于python - 通过 Python 字典元素隐式迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36461382/

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