Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将一个列表的元素除以另一个列表的元素_Python_List - Fatal编程技术网

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

Python 将一个列表的元素除以另一个列表的元素,python,list,Python,List,比如说,我有两份清单 a = [10, 20, 30 , 40, 50 , 60] b = [30, 70, 110] 如您所见,列表b由一个列表的元素和组成,window=2: b[0] = a[0] + a[1] = 10 + 20 = 30 etc. 如何获得另一个列表,该列表由给定窗口中的a元素和b元素的分数组成? 在我的示例中,我希望获得以下列表: c = [10/30, 20/30, 30/70, 40/70, 50/110, 60/110] 输出= [0.333333333

比如说,我有两份清单

a = [10, 20, 30 , 40, 50 , 60] 
b = [30, 70, 110]
如您所见,列表b由一个列表的元素和组成,window=2:

b[0] = a[0] + a[1] = 10 + 20 = 30 etc.
如何获得另一个列表,该列表由给定窗口中的a元素和b元素的分数组成? 在我的示例中,我希望获得以下列表:

c = [10/30, 20/30, 30/70, 40/70, 50/110, 60/110]
输出=

[0.3333333333333,0.666666666666,0.42857142855,0.5714285714285714,0.454545453,0.545454]

['10/30', '20/30', '30/70', '40/70', '50/110', '60/110']

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


如果确实需要分数,可以使用模块及其数据类型:

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)]
注 作为劳伦斯。注意,在注释中,上述内容仅适用于大小为2的块(您称之为窗口)。对于更通用的方法,您可以定义一个生成器,它将
为您生成这些代码:

# taken from https://stackoverflow.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]

下面是我的建议,一个函数用于求和,一个函数用于分数,列表和窗口宽度作为参数。它不使用外部软件包,而且非常简短、易于阅读和理解:

# Sum with a given window
def sumWithWindow(aList, window = 2):
    res = []
    mySum = 0
    for i,elem in enumerate(aList):
        mySum += elem
        if (i+1) % window == 0:
            res.append(mySum)
            mySum = 0
    return (res)


# Fraction with a given window
def fractionWithWindow(aList, window = 2):
    res = []
    b = sumWithWindow(aList, window)
    for i,elem in enumerate(aList):
        res.append(elem/b[int(i/window)])
    return (res)

# Example
a = [10, 20, 30 , 40, 50 , 60]
print(sumWithWindow(a, 2))
print(fractionWithWindow(a,2))
这也是一个单行程序样式的版本,具有列表理解功能,可读性稍差,但非常简短:

# Sum with a given window
def sumWithWindow(aList, window = 2):
    return [sum(aList[n:n+window]) for n in range(0,len(aList),window)]

# Fraction with a given window
def fractionWithWindow(aList, window = 2):
    return [elem/sumWithWindow(aList,window)[i//window] for i,elem in enumerate(aList)]

# Example
a = [10, 20, 30 , 40, 50 , 60]
print(sumWithWindow(a, 2))
print(fractionWithWindow(a,2))

你自己试过什么吗?几句话:1)如果你在做
val*1.0
转换
val
float
,只要做
float(var)
;它更加明确。2) 注意,您的代码是Python2.x 3)我觉得OP并没有根据他格式化问题的方式要求提供字符串列表。1)我的方式更短。我看不出有什么理由直言不讳。2) 已知,OP没有指定Py 2或3,3)这只是一个很好的补充,看起来像OP所要求的,而不是我的实际答案注意,这个智能代码适用于等于2的窗口宽度,但不适用于可配置的窗口宽度。@LaurentH。接得好!更新。
# Sum with a given window
def sumWithWindow(aList, window = 2):
    res = []
    mySum = 0
    for i,elem in enumerate(aList):
        mySum += elem
        if (i+1) % window == 0:
            res.append(mySum)
            mySum = 0
    return (res)


# Fraction with a given window
def fractionWithWindow(aList, window = 2):
    res = []
    b = sumWithWindow(aList, window)
    for i,elem in enumerate(aList):
        res.append(elem/b[int(i/window)])
    return (res)

# Example
a = [10, 20, 30 , 40, 50 , 60]
print(sumWithWindow(a, 2))
print(fractionWithWindow(a,2))
# Sum with a given window
def sumWithWindow(aList, window = 2):
    return [sum(aList[n:n+window]) for n in range(0,len(aList),window)]

# Fraction with a given window
def fractionWithWindow(aList, window = 2):
    return [elem/sumWithWindow(aList,window)[i//window] for i,elem in enumerate(aList)]

# Example
a = [10, 20, 30 , 40, 50 , 60]
print(sumWithWindow(a, 2))
print(fractionWithWindow(a,2))