【问题标题】:Multiply a list by the elements of other list将一个列表乘以其他列表的元素
【发布时间】:2022-01-25 02:14:57
【问题描述】:

我有这个列表列表,其中包含一系列值:

factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]

我想将每个 list1 的值相乘,但要与 list1 的相应元素相乘。我正在尝试这个:

factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
multiply = []
for i in factors:
    multiply = [values[i]*i]

但它不起作用。预期值为:

[[1, 2, 3], [6, 2, 8], [15, 15, 6]]

【问题讨论】:

  • 为什么是numpy 标志?你想让解决方案使用numpy吗?
  • @L.Grozinger 我认为它会有所帮助。我删除了numpy 标志

标签: python list


【解决方案1】:

试试这个:

factors = [1, 2, 3]
values = [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

multiply = []
for idx, lst in enumerate(values):
    multiply.append([factors[idx] * x for x in lst])

print(multiply)

有关上述代码的列表理解版本,请参阅@Hommes 答案

【讨论】:

  • 它确实给出了预期值
  • 对不起。您能否将其更新为我在帖子中编辑的更一般的场景
  • 此解决方案适用于更一般的场景(尝试插入不同的值)
【解决方案2】:

更新:鉴于问题的更一般设置,我改变了理解

列表理解的解决方案:

factors = [1, 2, 3]
values = [[1, 2, 3], [3, 1, 4], [5, 5, 2]]
multiply = [[factors[idx] * elem for elem in lst] for idx, lst in enumerate(values)]
Out[39]: [[1, 2, 3], [6, 2, 8], [15, 15, 6]]

【讨论】:

  • 想象我还有其他因素。你能用更一般的方式说吗?我将问题编辑得更笼统
  • 对其进行了更新,以便能够解决您制定的更一般的用例
【解决方案3】:

代码存在一些问题:

Python 使用零索引

Python 中列表的第一个元素的索引为 0。在你的 for 循环中:

for i in factor:
    multiply = [values[i]*i]

最后一次迭代将尝试访问values[3]。但是values只有3个元素,所以最后一个元素是values[2]不是values[3]

列表和整数的乘法 * 实际上并不相乘

将列表乘以Int,例如n,会得到一个新列表,该列表将原始n 次连接起来。例如:

>>> [1, 2, 3] * 3
[1, 2, 3, 1, 2, 3, 1, 2, 3]

在列表上实际广播乘法的最直接方法是使用“列表推导”。例如:

>>> [3*x for x in [1,2,3]]
[3, 6, 9]

将其应用到您的示例中将类似于:

for i in factors:
    multiply = [i*x for x in values[i-1]]

您只保留multiply 中的最后一个计算

每次循环您的for 循环,您都会为multiply 分配一个新值,覆盖之前的所有值。如果你想收集你所有的结果,那么你应该appendmultiply 列表。

multiply.append([i*x for x in values[i-1]])

总的来说,您的示例固定为:

factors = [1,2,3]
values = [[1,2,3],[3,1,4],[5,5,2]]
multiply = []
for i in factors:
    multiply.append([i*x for x in values[i-1]])

改进

但是,在简洁性和可读性方面仍有改进代码的方法。

问题的根源是将列表的元素乘以一个数字。 * 做不到,但你可以编写自己的函数:

def multiply_list(X, n):
    return [n*x for x in X]

然后您可以使用此函数和列表推导来删除 for 循环:

multiply = [multiply_list(x, i) for (x, i) in zip(values, factors)]

或者,如果你认为它是可读的,那么你可以使用嵌套列表推导,它更简洁:

multiply = [[factor * x for x in value] for (value, factor) in zip(values, factors)]

【讨论】:

  • 代码没有给出预期的结果。结果是multiply = [[3, 6, 9], [3, 6, 9], [3, 6, 9]],应该是multiply = [[1, 2, 3], [2, 4, 6], [3, 6, 9]]
  • 我无法重现,上面的所有代码都按我的预期工作。只需复制粘贴代码即可正常工作
【解决方案4】:

您可以对单行使用列表推导。试试这个

multiply = [[x * y for y in list1] for x in list1]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 2023-03-19
    • 1970-01-01
    • 2014-02-27
    • 2019-10-15
    相关资源
    最近更新 更多