从生成器返回int-Python
我一直在试图找到一种从生成器中生成int值的方法,但是脚本引擎向我抛出了错误从生成器返回int-Python,python,python-3.x,Python,Python 3.x,我一直在试图找到一种从生成器中生成int值的方法,但是脚本引擎向我抛出了错误 def inorderTraversal(self, node): if(node.left): for n in self.inorderTraversal(node.left): yield n[0] yield node.data[0] if(node.right): for n in
def inorderTraversal(self, node):
if(node.left):
for n in self.inorderTraversal(node.left):
yield n[0]
yield node.data[0]
if(node.right):
for n in self.inorderTraversal(node.right):
yield n[0]
错误是:
文件“ac.py”,第142行,在inorderTraversal中yield n[0]类型错误:“int”对象不可下标 在哪里
n={10,“X”}
。我试图搜索它,但据我所知,没有一种解决方案能满足我的需要。您需要将收益n[0]
替换为收益n
。您已经在生成节点的(整)值,因此无需对其进行进一步索引
编辑:添加解释。您需要将
产量n[0]
替换为产量n
。您已经在生成节点的(整)值,因此无需对其进行进一步索引
n = {10,"X"}
print(n[0])
编辑:添加解释
n = {10,"X"}
print(n[0])
屈服
TypeError: 'set' object does not support indexing
不是确切的错误,但我正在Android IDE上测试,所以这并不完全让我吃惊
答案是,你试图为一个集合下标,但这意味着什么?集合是无序的,因此集合中没有“0”元素。如果您想要随机访问,则需要切换到列表
或者,如果您只是在寻找一个简单的临时容器,元组是可索引的
如果n
是节点数据,那么您可以创建一个节点
类,然后直接访问该字段,而不是索引
屈服
TypeError: 'set' object does not support indexing
不是确切的错误,但我正在Android IDE上测试,所以这并不完全让我吃惊
答案是,你试图为一个集合下标,但这意味着什么?集合是无序的,因此集合中没有“0”元素。如果您想要随机访问,则需要切换到列表
或者,如果您只是在寻找一个简单的临时容器,元组是可索引的
如果
n
是节点数据,那么您可以创建一个节点
类,然后直接访问该字段,而不是索引 如果您的yield node.data[0]
是正确的,那么在递归情况下执行yield n[0]
就像在该分支中执行yield node.data[0][0]
。因此,将其改为yield n
,因为递归案例已经为您提供了所需的内容,您只需传递它即可
此外,在设计树时,您通常使用.data
存储树的用户希望存储在其中的数据的方式,而不必担心它是什么或它的外观,因此您通常使用生成node.data
同样,正如在Python3中一样,您可以使用作为这种for循环的快捷方式的
考虑到这些,您的代码应该如下所示
def inorderTraversal(self, node):
if node.left:
yield from self.inorderTraversal(node.left)
yield node.data
if node.right:
yield from self.inorderTraversal(node.right)
由于你没有提供你的问题的答案,我只能猜测,所以 让我们看一个这样的树代码示例
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
这样,我们就可以构建一个类似于中的示例树
让我们用[int,str]的数据结构再做一次
test2 = Node([6,"F"],
Node([2,"B"],
Node([1,"A"]),
Node([4,"D"],
Node([3,"C"]),
Node([5,"E"])
)
),
Node([7,"G"],
None,
Node([9,"I"],
Node([8,"H"])
)
)
)
现在是有趣的部分,索引函数,首先是你的
def inorderBad(node):
if node.left:
for n in inorderBad(node.left):
yield n[0]
yield node.data[0]
if node.right:
for n in inorderBad(node.right):
yield n[0]
让我们用test2
>>> list(inorderBad(test2))
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
list(inorderBad(test2))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 26, in inorderBad
for n in inorderBad(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 27, in inorderBad
yield n[0]
TypeError: 'int' object is not subscriptable
>>>
并测试它
>>> list(inorder2(test2))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
按预期工作,让我们试试另一个
>>> list(inorder2(test1))
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
list(inorder2(test1))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 37, in inorder2
yield node.data[0]
TypeError: 'int' object is not subscriptable
>>>
试验
如果您的
yield node.data[0]
是正确的,那么在递归情况下执行yield n[0]
就像在该分支中执行yield node.data[0][0]
。因此,将其改为yield n
,因为递归案例已经为您提供了所需的内容,您只需传递它即可
此外,在设计树时,您通常使用.data
存储树的用户希望存储在其中的数据的方式,而不必担心它是什么或它的外观,因此您通常使用生成node.data
同样,正如在Python3中一样,您可以使用作为这种for循环的快捷方式的
考虑到这些,您的代码应该如下所示
def inorderTraversal(self, node):
if node.left:
yield from self.inorderTraversal(node.left)
yield node.data
if node.right:
yield from self.inorderTraversal(node.right)
由于你没有提供你的问题的答案,我只能猜测,所以 让我们看一个这样的树代码示例
class Node:
def __init__(self, data, left=None, right=None):
self.data = data
self.left = left
self.right = right
这样,我们就可以构建一个类似于中的示例树
让我们用[int,str]的数据结构再做一次
test2 = Node([6,"F"],
Node([2,"B"],
Node([1,"A"]),
Node([4,"D"],
Node([3,"C"]),
Node([5,"E"])
)
),
Node([7,"G"],
None,
Node([9,"I"],
Node([8,"H"])
)
)
)
现在是有趣的部分,索引函数,首先是你的
def inorderBad(node):
if node.left:
for n in inorderBad(node.left):
yield n[0]
yield node.data[0]
if node.right:
for n in inorderBad(node.right):
yield n[0]
让我们用test2
>>> list(inorderBad(test2))
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
list(inorderBad(test2))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 26, in inorderBad
for n in inorderBad(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 27, in inorderBad
yield n[0]
TypeError: 'int' object is not subscriptable
>>>
并测试它
>>> list(inorder2(test2))
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>>
按预期工作,让我们试试另一个
>>> list(inorder2(test1))
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
list(inorder2(test1))
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 35, in inorder2
for n in inorder2(node.left):
File "C:\Users\David\Documents\Python Scripts\stackoverflow_test.py", line 37, in inorder2
yield node.data[0]
TypeError: 'int' object is not subscriptable
>>>
试验
是否要返回节点或其值?看起来像是
yield node。数据[0]
返回一个值,而两个for循环访问返回值时,就好像它是一个节点而不是一个值一样。您是否100%确定n
是相等的?还是你在猜?放一个打印行以确保。你确定你的类型是n
,它说它只是一个int
(可能来自递归收益率),并且你描述了一个集合,它是不可订阅的。您正在将递归与生成器混合使用,如果您真的想这样做,那么请查看从…
生成的,您可以将self.inorderTraversal(node.left)中的n替换为:使用self.inorderTraversal(node.left)生成的生成n
,您可能需要读取和。是否要返回节点或其值?看起来像是yield node。数据[0]
返回一个值,而两个for循环访问返回值时,就好像它是一个节点而不是一个值一样。您是否100%确定n
是相等的?还是你在猜?放一个打印行以确保。你确定你的类型是n
,它说它只是一个int
(可能来自递归收益率),并且你描述了一个集合,它是不可订阅的。您正在将递归与生成器混合使用,如果您真的想这样做,那么请看一下yield from…
,您可以将self.inorderTraversal(node.left)中的n替换为:yield n
为yield from self.inorderTraversal(node.left)
您可能需要阅读和。但我知道您没有