【问题标题】:Difficulty creating a dict that contains lists of values难以创建包含值列表的 dict
【发布时间】:2020-05-21 16:53:28
【问题描述】:

现在让我们编写几个我们可以使用的函数。我们将编写一个名为 m_b_data 的函数,它给出一条线的斜率,???? , y 截距, ???? , 将返回一个字典,其中键为 x 指向 x_values 列表,键为 y 指向 y_values 列表。每个 ????值应该是所提供的回归线的输出 ????和 ????值,用于每个提供的 x_values。

我写的:

def m_b_data(m, b, x_values):
    y_values = {}
    for x in x_values:
       y_values = {"X Values": x, "Y Values": (m*x)+b}   

    return y_values

传入的参数:

m_b_data(1.5, 20, [0, 50, 100])

我的输出:

{'X Values': 100, 'Y Values': 170.0}

以及它应该输出什么:

{'x': [0, 50, 100], 'y': [20.0, 95.0, 170.0]}

据我了解,在我的 for 循环中,我实际上只是在复制最终值。我猜正在发生的是我只是不断地重写字典的第一个键/值对。我不是在附加字典来添加新值,而是不断地覆盖第一对。对吗?

如何编写循环以创建具有多个 X 和 Y 值的列表?

【问题讨论】:

    标签: python dictionary


    【解决方案1】:

    如果有 C++ 或 Java 背景的人,自然倾向于在集合上编写大量显式循环。这不是 Python 的方式。通常可以通过战略性地使用列表推导和生成器表达式来简化这些循环。您的代码通常会变得更短且更易于遵循,这是一个很好的双赢。

    让我们尝试这种方法,并构建一个无循环版本。在您的程序中,您正在尝试构建一个字典。让我们看看我们是否可以直接返回一个。我们将一步一步填写。首先,一个字典:

    return {
        ???
    }
    

    具有两个键/值对的字典:

    return {
        "X Values": ???,
        "Y Values": ???,
    }
    

    现在呢?占位符中有什么?嗯,第一个是 X 值的列表。你已经有了:它是x_values。无需遍历x_values 中的每个x。让我们直接把它放在字典里。

    return {
        "X Values": x_values,
        "Y Values": ???,
    }
    

    我们如何处理 Y 值?这是列表推导的用武之地。您希望将公式y = m*x+b 应用于每个x 值。我们可以在一行中完成所有操作,同时应用公式和构建列表:

    return {
        "X Values": x_values,
        "Y Values": [m*x+b for x in x_values],
    }
    

    我们完成了。 Python 不是很伟大吗?

    【讨论】:

    • 这是某种魔法。我真的很喜欢 Python,但在这一点上,这是一种完全不同的心态。我习惯于为所有内容编写循环,现在我了解到该语言的某些方法和功能不需要任何明确的内容。
    【解决方案2】:

    每次写入y_values = ... 时都会覆盖y_values。根据您说要输出的内容,您的代码应该是:

    def m_b_data(m, b, x_values):
        y_values = {'x': [], 'y': []}
        for x in x_values:
            y_values['x'].append(x)
            y_values['y'].append(m * x + b)   
    
        return y_values
    

    【讨论】:

      【解决方案3】:

      问题在于,在你的 for 循环中,你总是覆盖 y_values 字典(只有一个键值对),而不是向其中添加项目。

      您的代码应该看起来更像这样:

      def m_b_data(m, b, x_values):
          y_values = []
          for x in x_values:
               y_values.append((m*x)+b)
      
          return {
              "X": x_values,
              "Y": y_values,
          }
      

      首先,您声明一个列表并循环遍历 x_values 列表以将生成的 y 值添加到该列表中。

      然后你创建字典,它将是:

      “X”:[x_values 列表]

      “Y”:[y 值列表]

      (当然这是考虑到输入 x_values 是一个列表,如果它是一个字典,则需要进行一些更改,但我认为它是一个列表,因为这就是您在调用中使用它的方式:

      m_b_data(1.5, 20, [0, 50, 100])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-03
        • 1970-01-01
        • 1970-01-01
        • 2018-12-03
        • 2022-11-25
        • 2018-02-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多