【问题标题】:Multiply list by all elements of the list except at it's own index将列表乘以列表的所有元素,除了它自己的索引
【发布时间】:2016-03-29 15:07:15
【问题描述】:

我正在尝试构建一个给定列表的函数,该函数将返回一个元素相乘的列表,不包括位于同一索引处的元素。例如对于列表[1,2,3,4],它将返回[2*3*4,1*3*4,1*2*3]。 这是我尝试过的

import numpy as np
def my_function(ints):
products = np.ones(len(ints))
indices = range(0,len(ints))
for i in ints:
    if i != indices[i]
        products *=ints[i]
return products

我认为我的问题是我认为“i”将引用索引而不是这些索引的值。

  1. 如何创建引用索引而不是值的内容
  2. 有没有更好的方法来解决这个问题?

【问题讨论】:

  • 可能有一个聪明的单线来做你想做的事......但我只会评论如何在迭代时获取索引:使用 enumerate 内置函数,例如for i, value in enumerate(mylist):
  • enumerate() 会给你价值和迭代器。否则,使用范围循环。
  • 最简单也可能最快的方法是找到所有元素的乘积,然后除以每个元素得到结果。但是如果使用固定长度的整数,它可能会溢出。

标签: python list numpy


【解决方案1】:

numpy 这很容易:

import numpy as np
def fun(input):
    arr = np.array(input)
    return arr.prod() / arr

【讨论】:

    【解决方案2】:

    取自@interjay 的评论:

    from operator import mul
    
    total = reduce(mul, ints)
    multiplied = [total/y for y in ints]
    

    【讨论】:

      【解决方案3】:

      enumerate 的解决方案:

      def my_function(ints):
          res = []
          for i, el in enumerate(ints):
              res.append(reduce(lambda x, y: x*y, ints[:i] + ints[i+1:]))
          return res
      
      print my_function([1,2,3,4])
      >>> [24, 12, 8, 6]
      

      【讨论】:

        【解决方案4】:

        列表理解

        array_of_nums = np.random.rand(10)
        [np.prod([i for x, i in enumerate(array_of_nums) if x != e]) for e, y in enumerate(array_of_nums)]
        

        【讨论】:

          【解决方案5】:

          不使用除法

              import numpy as np
              
              def remainingProduct(arr):
                  a = arr
                  list1 = []
                  n = len(arr)
                  for i in range(0, n):
                      b = a[0]
                      a.remove(a[0])
                      c = np.prod(a)
                      list1.append(c)
                      a.append(b)
                  return list1
              
              # print(remainingProduct([3, 2, 1]))#[2, 3, 6].
          

          【讨论】:

            【解决方案6】:

            这是一种使用reduce的方法:

            from functools import reduce
            from operator import mul
            
            l = [1, 2, 2, 3, 4]
            # Modified to work with lists that contain dupes thanks to the feedback in comments
            print [reduce(mul, l[:i]+l[i+1:], 1) for i in xrange(len(l))]
            >>> [48, 24, 24, 16, 12]
            

            【讨论】:

              【解决方案7】:

              将枚举合并到代码中的方法是

              import numpy as np
              def intmult(ints):
                  products = np.ones(len(ints))
                  for i,j in enumerate(ints):
                      products *= ints[i]
                  for i,j in enumerate(products):
                      products[i] /= ints[i]
                  return products
              

              请注意,这不包括元素之一为 0 的情况。

              【讨论】:

                【解决方案8】:

                这是一个简单的方法

                def mul_numbers(nums):
                    new_arr = []
                    for i in range(len(nums)):
                        product = 1
                        for j in range(len(nums)):
                            if nums[i] != nums[j]:
                                product *= nums[j]
                        new_arr.append(product)
                
                    return new_arr
                
                
                arr = [1, 2, 3, 4, 5]
                result = mul_numbers(arr)
                print(result)
                
                >>> [120, 60, 40, 30, 24]
                

                【讨论】:

                • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation 将通过展示为什么这是解决问题的好方法,并使其对有其他类似问题的未来读者更有用,从而大大提高其长期价值。请edit您的回答添加一些解释,包括您所做的假设。
                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2021-02-22
                • 2020-11-06
                • 2020-07-18
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2022-01-25
                相关资源
                最近更新 更多