将数字列表乘以数字范围

2024-04-20 09:13:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图为模数11编写代码,但未能使其更像python。在

到现在为止,我使用一个权重并增加它,当它达到一个数字时进行检查,然后将它设置为它的原始值。在

假设我有一个数字列表 1..20我想用2,3,4,5,6,7,8,9,2,3,4,etc乘以它们,这样每个索引都会被乘以一个递增的数字。在

1x2、2x3、3x4、4x5、5x6、6x7、7x8、8x9、9x2、10x3等。。在

有什么优雅的方法吗?在

不正当的方式:

def mod11(list, max_weight=9):
    sum = 0
    weight = 2

    for item in reversed(list):
        sum += item * weight
        weight += 1

        if weight > max_weight:
            weight = 2

    mod = 11 - sum % 11

    if mod > 9:
        return 0

    else:
        return mod

Tags: 方法代码mod列表returnifetc数字
3条回答

可以使用当前索引确定乘数:

>>> [(index % 8 + 2) * item for index, item in enumerate(range(1, 21))]
[2, 6, 12, 20, 30, 42, 56, 72, 18, 30, 44, 60, 78, 98, 120, 144, 34, 54, 76, 100]
#^        resets               ^            resets               ^

或者,您可以"cycle"乘法器序列并压缩输入序列:

^{pr2}$

这里已经有很多好的答案了,如果你想用numpy(通常对这类事情很好),这里有一个替代方法:

In [1]: import numpy as np

In [2]: a = np.arange(1, 21)  # like range in numpy array

In [3]: a - 1  # calculation performs per element wise... so will a * n
Out[3]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])


In [4]: a * ((a - 1) % 8 + 2)  # directly translate the calculation
Out[4]:
array([  2,   6,  12,  20,  30,  42,  56,  72,  18,  30,  44,  60,  78,
        98, 120, 144,  34,  54,  76, 100])

好吧,我不太确定我是否能正确地理解你的问题,因为你说的是模数11,但似乎也使用了从2到9的数字。在

但我们先把1..20列为一个列表,可能如下:

list(range(1,21))    (This is if you want to include the 20)

接下来,要将某个整数转换为2到9之间的数字,可以执行以下操作:

^{pr2}$

将这两者结合起来,你可以做出一个列表理解:

[((x-1) % 8 + 2) * x for x in xrange(1,21)]

(添加-1是为了使第一个数字从2开始而不是从3开始)

相关问题 更多 >