从生成器返回int-Python

从生成器返回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

我一直在试图找到一种从生成器中生成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 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)
您可能需要阅读和。但我知道您没有