【问题标题】:How to use range(len(list)) to find the product of all even-indexed integers in a list?如何使用 range(len(list)) 查找列表中所有偶数索引整数的乘积?
【发布时间】:2018-12-18 13:45:33
【问题描述】:

我对编码很陌生,我正在做一个任务,我必须在一个巨大的列表中找到所有偶数索引整数的乘积:

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

问题建议使用 range(len(list)),它给了我范围 (1,50),但我不明白这有什么关系。我设法在不使用该方法的情况下得到了答案:

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

result = 1
evenlist = number_list[::2]
for num in evenlist:
    result = result * num

range(len(list)) 在这里有什么用处?

【问题讨论】:

  • 这是一个不好的建议,不应该使用range 来解决这个问题。
  • result = functools.reduce(operator.mul, number_list[::2])
  • 如果有帮助,您也可以跳过范围。 range(start, stop, skip)
  • 给你这个作业的人应该先学习 Python,然后再假装教它。像你一样使用切片是正确的 Python 方式(使用 reduce(),如 CoryKramer 所示更好)。

标签: python list


【解决方案1】:

可能是这样的,你使用数组的索引来引用它;

number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]

result = 1
for idx in range(0, len(number_list), 2):
   result = result * number_list[idx]

【讨论】:

  • @DeepSpace 是的,我实际上也注意到了,应该很容易添加但是 OP 应该首先澄清。
  • 是的,对不起,我错过了细节 - 问题要求所有偶数索引整数的乘积。我应该如何将其纳入您提供的解决方案?
  • 这可能不是现实生活用例的最佳方式,但我想这就是作业所期望的。
【解决方案2】:

我要补充一点,@fixatd 的答案是正确的,但也要提醒您该解决方案不是 Pythonic。我知道您的书/讲师希望以某种方式获得答案,但我想详细说明并向您展示一些更好的选择,以便您不受他们希望看到的解决方案的束缚。

例如,这将是一种更实用的解决方案:

from operator import mul
from itertools import islice
from functools import reduce
number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]
reduce(mul, islice(number_list, 0, None, 2))
218032559868925537961630414929920000

或者,如果您喜欢较少的导入或较少的功能,您可以像原生一样循环。在 python 中,您通常只会循环遍历可迭代对象。成语是

for something in iterable:  

使用范围内的 len 来迭代地循环某些东西通常不太像 Python。如果您出于某种原因碰巧需要索引,请使用枚举:

for index, item in enumerate(iterable):

您提供的解决方案实际上非常好,而且与作业要求的不同。这是您的解决方案略微清理:

result = 1
for num in number_list[::2]:
    result *= num

>>>result
218032559868925537961630414929920000

【讨论】:

    【解决方案3】:

    您为什么对使用范围感兴趣?下面还有其他两种变体可以解决您的问题。

    第一种方式:

    result = 1
    for numbers in number_list:
        result *= numbers
    

    第二种方式:

    from functools import reduce
    reduce(lambda a, b: a*b, number_list)
    

    【讨论】:

      【解决方案4】:

      嗯,除了@fixatd 的回答,你也可以用reduce

      import operator
      from functools import reduce
      
      def prod(iterable):
          return reduce(operator.mul, iterable, 1)
      
      result = prod(evenlist)
      

      【讨论】:

        【解决方案5】:

        您可以做的是遍历数组,但您可以使用 range(start,end,jump) 将每次迭代的“跳转”指定为两个而不是一个。当你在做list[::2] 时,你正在做的是创建一个新数组并删除所有其他元素,然后对其进行迭代。小心,因为更大的输入可能需要更多的资源。

        number_list = [12, 41, 10, 34, 37, 2, 3, 8, 42, 46, 46, 27, 13, 49, 41, 2, 28, 21, 37, 27, 31, 19, 46, 7, 50, 1, 46, 45, 19, 10, 14, 8, 44, 14, 10, 4, 23, 29, 46, 18, 32, 40, 32, 7, 33, 45, 26, 24, 43, 45]
        
        prod = 1
        for i in range(0, len(number_list), 2):
            prod *= list[i]
        

        【讨论】:

        • 这与@fixatd 的答案几乎相同。除非你打错了:list -> number_list。
        • @Jérôme ,我想说这与 fixatd 的答案相同
        猜你喜欢
        • 1970-01-01
        • 2018-07-21
        • 2020-05-20
        • 1970-01-01
        • 2020-07-18
        • 2021-06-15
        • 2017-07-10
        • 1970-01-01
        • 2020-11-06
        相关资源
        最近更新 更多