【问题标题】:Python 3 - Not understanding single line double loopPython 3 - 不理解单行双循环
【发布时间】:2019-04-23 13:21:29
【问题描述】:

我在看下面的函数:

# Initialize a network
def initialize_network(n_inputs, n_hidden, n_outputs):
    network = list()
    hidden_layer = [{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)]
    network.append(hidden_layer)
    output_layer = [{'weights':[random() for i in range(n_hidden + 1)]} for i in range(n_outputs)]
    network.append(output_layer)
    return network

但是,我特别卡在[{'weights':[random() for i in range(n_inputs + 1)]} for i in range(n_hidden)] 行。我正在尝试将该单行重新创建为一个函数:

def make_weights(n_inputs, n_hidden):
    # for i in range(n_inputs + 1):
        # make a random number?
    # for i in range(n_hidden):
        # make a random number?
    # return array of random numbers?

但是,我不太明白那条线在做什么。它循环输入的数量+ 1次,并创建一个随机数?然后对隐藏输入的数量做同样的事情吗?

我正在寻求对那条线的解释,并帮助将那条线映射成更清晰的函数。

目前使用的资源:

【问题讨论】:

  • [random() for i in range(n_inputs + 1)] 创建一个 n_inputs + 1 随机元素列表(每个元素相互独立生成),[{'weights':[...]} for i in range(n_hidden)] 创建一个 n_hidden 字典列表,其中每个字典包含一个键'weights',与 n_inputs + 1 随机生成的元素列表相关联。

标签: python python-3.x for-loop


【解决方案1】:

一般来说,以下两种是等价的:

result = [obj for sub in iterable for obj in sub]

# and

result = []
for sub in interable:
    for obj in sub:
        result.append(obj)

因此,您的make_weights 函数可以定义如下:

def make_weights(n_inputs, n_hidden):
    result = []
    for i in range(n_hidden):
        weights = {'weights': []}
        for j in range(n_inputs + 1):
            weights['weights'].append(random())

        result.append(weights)

【讨论】:

  • 这会产生与运行单行函数相同的结果。而且,我很欣赏这个解释。谢谢!
  • @JerryM。别客气!此外,我实际上发现理解通常更具可读性;只是这个结构不好。
【解决方案2】:

一个等价的for循环可能如下,

results = []
for i in range(n_hidden):
        weights = {'weights': []}
        for j in range(n_inputs + 1):
            weights['weights'].append(random())
        result.append(weights)

【讨论】:

  • 你不再需要dct了。
  • 更新了,我的错!
  • 你没有使用任何_
  • 更新了,我的错!
  • @DeveshKumarSingh 非常感谢,这很有效!我最终选择了另一个答案,因为它首先发布+解释,但这确实解决了问题。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2017-09-11
  • 2021-08-22
相关资源
最近更新 更多