我对编码非常陌生,我正在做一个作业,我必须在一个巨大的列表中查找所有偶数索引整数的乘积:
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))在这里有用吗?
答案 0 :(得分:4)
可能是这样的,您可以在其中使用数组的索引来引用它;
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]
答案 1 :(得分:1)
我要补充一点,@ 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在范围内的某物只是迭代地遍历某物通常不那么pythonic。如果由于某种原因确实需要索引,请使用enumerate:
for index, item in enumerate(iterable):
您提供的解决方案实际上是非常好的Python风格的,与工作分配的要求相反。这是您的解决方案,需要稍作清理:
result = 1
for num in number_list[::2]:
result *= num
>>>result
218032559868925537961630414929920000
答案 2 :(得分:0)
为什么对使用范围感兴趣?下面有两个其他变体可以解决您的问题。
第一种方式:
result = 1
for numbers in number_list:
result *= numbers
第二种方式:
from functools import reduce
reduce(lambda a, b: a*b, number_list)
答案 3 :(得分:0)
好吧,除了@fixatd的答案,您还可以使用reduce来做到这一点:
import operator
from functools import reduce
def prod(iterable):
return reduce(operator.mul, iterable, 1)
result = prod(evenlist)
答案 4 :(得分:-1)
您可以做的是遍历数组,但是可以将每次迭代的“跳转”指定为两次,而不是使用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]