gpt4 book ai didi

python - 如何在新迭代器中产生迭代器中的元素?

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

我需要一个遍历 JSON 对象中所有叶子的迭代器。所以我写了这个函数

rec = {'a': {'b': [{'c': {'d': [{'e': 'x1','f': 'x2'}],'g': 'x3'}}],'h': 'x4','i': 'x5','j': [{'k': 'x6'}],'l': [{'m': {'n': 'x7'}}]}}

def yield_leaves(rec, lbl = ''):
if isinstance(rec, dict):
for key, value in rec.items():
for to_yield in yield_leaves(value, key):
yield to_yield
if isinstance(rec, list):
for value in rec:
for to_yield in yield_leaves(value, lbl):
yield to_yield
if isinstance(rec, (int, str)):
for entry in rec.split():
yield entry, lbl

print(list(yield_leaves(rec)))
>>> [('x5', 'i'), ('x4', 'h'), ('x1', 'e'), ('x2', 'f'), ('x3', 'g'), ('x6', 'k'), ('x7', 'n')]

但我认为有些代码是多余的。下面一行

for to_yield in yield_leaves(value, key):
yield to_yield

它迭代迭代器并返回值作为迭代器的一部分。

您知道更有效的编码方法吗?

最佳答案

你的最后一部分

if isinstance(rec, (int, str)):
for entry in rec.split():
yield entry, lbl

有点奇怪。如果 recint ,它将崩溃,因为整数没有 .split 方法。并且您的字符串都不包含空格,因此对它们调用 .split 将仅返回包含单个项目的列表:原始字符串。我猜你的真实数据可能包含你想要拆分的多字字符串,但如果是这样,你确实需要与 ints 分开处理。

因此,假设您没有想要拆分的多单词值,我稍微简化了您的代码。正如你所看到的,我只保留了 dictlist 测试,由于数据是从 JSON 解码的,任何其他 rec 类型都会是某种标量:intstrboolNone(除非您创建了一个自定义解码),我们可以相同地处理所有这些标量类型。

rec = {
'a': {
'b': [
{
'c': {
'd': [{'e': 'x1', 'f': 'x2'}],
'g': 'x3'
}
}
],
'h': 'x4',
'i': 'x5',
'j': [{'k': 'x6'}],
'l': [{'m': {'n': 'x7'}}]
}
}

def yield_leaves(rec, lbl=''):
if isinstance(rec, dict):
for key, value in rec.items():
yield from yield_leaves(value, key)
elif isinstance(rec, list):
for value in rec:
yield from yield_leaves(value, lbl)
else:
yield rec, lbl

print(list(yield_leaves(rec)))

输出

[('x1', 'e'), ('x2', 'f'), ('x3', 'g'), ('x4', 'h'), ('x5', 'i'), ('x6', 'k'), ('x7', 'n')]

此代码使用 Python 3 功能 yield from;如果您没有使用 Python 3,那么您应该使用。 :)

关于python - 如何在新迭代器中产生迭代器中的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44364256/

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