【问题标题】:Running for-loop and trying to multiply list items运行 for 循环并尝试将列表项相乘
【发布时间】:2021-11-09 14:39:41
【问题描述】:

我正在尝试在 for 循环中为给定列表(此处为 3、4、1)中的所有项目运行方程式。想法是使用列表 a 中的数字和范围中的数字(列表的索引号)。

所以第一个没问题,3 * 3^2 + 3 + 5 = 35。这应该遍历列表中的所有项目并返回 [[35, 57, 9]] 但给出 [[35, 4 , 1]] 代替。我知道它不会运行所有三个项目,但是我缺少的是什么。

def calculate_f(a):

    i=0
    lis = []

    for x in range(0, len(a)):
        
        a[i] = 3 * (a[i]**2) + a[i] + 5

        lis.append(a)
        
        i += 1

        return lis

a = [3,4,1]  
calculate_f(a)

已经这样做了三个小时,并得到了不同的错误消息,但这几乎可以工作:D

谢谢

【问题讨论】:

  • edit 并修复您的 IndentationErrors - 然后 pythontutor.com - 逐步检查。
  • 顺便说一句。您一遍又一遍地添加相同的列表引用,因此所有引用都将指向相同的数据。您可能想查找如何复制()或克隆()列表。
  • 对不起,编辑在复制粘贴时把缩进搞砸了。
  • 在您的 for 循环中,您正在执行 for x in range(0, len(a)),但忽略了 x,而是手动维护您自己的索引计数器 i。您可以只使用a[x],或者更简单地使用for x in a: 直接遍历列表中的项目。但有关更多解决方案,请参阅我的答案。

标签: python list for-loop indexing


【解决方案1】:

在 Python 中,如果要将函数应用于值列表,有许多更简单的方法。

首先在单个元素上定义你的函数:

>>> def f(x):
...     return 3 * x**2 + x + 5

现在有很多方法可以将此函数“映射”到值列表。比如内置的map()

>>> m = map(f, [3, 4, 5])
>>> m
<map at 0x7f6aa8b00150>

这实际上返回了一个可迭代的映射对象,它可以一次返回每个值:

>>> next(m)
35

或者你可以把它传递给list():

>>> list(map(f, [3, 4, 5]))
[35, 57, 85]

或者,如果您想更舒服,也可以使用简单的for 循环:

>>> m = []
>>> for x in [3, 4, 5]:
...     m.append(f(x))

或者更高级/更简洁的版本,列表理解:

>>> m = [f(x) for x in [3, 4, 5]]
>>> m
[35, 57, 85]

或者,如果您最终想要快速按元素进行数值计算,请熟悉NumPy arrays

>>> import numpy as np
>>> f(np.array([3, 4, 5]))
array([35, 57, 85])

【讨论】:

  • 谢谢。这里的想法是在没有 Numpy 的情况下做到这一点,但感谢您的见解。让我前进。
【解决方案2】:

试试这个:-

def calculate_f(a):
    return [3 * x ** 2 + x + 5 for x in a]
 
print(calculate_f([3,4,1]))

【讨论】:

    猜你喜欢
    • 2019-08-23
    • 2020-10-22
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多