Python: сложные итерируемые - PullRequest
0 голосов
/ 17 сентября 2018

Я видел этот фрагмент кода, который перебирает определенные члены класса, если они существуют. Примечательно, что в двоичном дереве итерация по дочернему элементу, пока дочерних элементов больше нет.

Двоичное дерево определяется как ..

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None

и они повторили это так:

# type root : TreeNode
def iterateTree(self, root):
    level_list = [root]

    while level_list:

        for item in level_list:
             print(item.val)

        # This iterable seems really complicated for me to understand how they came up with this
        level_list = [child for node in level_list for child in (node.left, node.right) if child]

Я не уверен, как они придумали эту строку для перебора левого и правого узла, я бы никогда не придумал это на месте ... Как бы я проанализировал эту строку?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

, если я не ошибаюсь, это утверждение является питонским и кратким способом создания списка.

 # This iterable seems really complicated for me to understand how they came up with this
   level_list = [child for node in level_list for child in (node.left, node.right) if child]

это в основном сокращенный способ выполнения следующего набора строк:

for node in level_list:
    for child in (node.left, node.right):
        if child:
            level_list.append(child)

хитрость в понимании этого стенографического утверждения заключается в рассмотрении периферийных ограничивающих символов, в данном случае это [ и ]. который идентифицируется с последовательностью списка в Python. поскольку в списке есть итераторы (for loop), мы в основном создаем или добавляем элементы (переменная child) в указанный список.

/ OGS

0 голосов
/ 17 сентября 2018

читать следующим образом:

for node in level_list:
    for child in (node.left, node.right):
        if child:
            child
...