且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

将一个列表的元素除以另一列表的元素

更新时间:2022-02-09 23:44:02

您可以对两个任务都使用列表理解(创建 b c 列表)

You can use list-comprehensions for both tasks (creating b and c lists)

a = [10, 20, 30, 40, 50, 60]

b = [i+j for i, j in zip(a[::2], a[1::2])]
print(b)  # [30, 70, 110]

c = [x / b[i//2] for i, x in enumerate(a)]
print(c)  # [0.3333333333333333, 0.6666666666666666, 0.42857142857142855, 0.5714285714285714, 0.45454545454545453, 0.5454545454545454]


如果您确实想要分数,则可以使用 fractions 模块及其 Fraction 数据类型:


If you really want fractions, you can use the fractions module and its Fraction data type:

from fractions import Fraction

# same code as before

c = [Fraction(x, b[i//2]) for i, x in enumerate(a)]
print(c)  # [Fraction(1, 3), Fraction(2, 3), Fraction(3, 7), Fraction(4, 7), Fraction(5, 11), Fraction(6, 11)]

注意

就像@LaurentH.注意在注释中,以上内容仅适用于大小为2的块(您称它们为 windows ).对于更通用的方法,您可以定义一个生成器,将生成 yield 为您:

Note

As @LaurentH. notices in the comments, the above works only for chunks (you call them windows) of size 2. For a more general approach, you can define a generator that would yield them for you:

# taken from https://***.com/a/312464/6162307
def yield_chunks(l, n):
    """Yield successive n-sized chunks from l."""
    for i in range(0, len(l), n):
        yield l[i:i + n]    

b = [sum(chunk) for chunk in yield_chunks(a, 2)]
# same code

n = 3 的示例:

n = 3
b = [sum(chunk) for chunk in yield_chunks(a, n)]
print(b)  # [60, 150]
c = [x / b[i//n] for i, x in enumerate(a)]
print(c)  # [0.16666666666666666, 0.3333333333333333, 0.5, 0.26666666666666666, 0.3333333333333333, 0.4]