在python中总结一系列数字

时间:2017-11-02 17:02:13

标签: python python-3.x

嗨,我是编程的新手,我不知道如何编写一个循环,它将扩展一个空列表,其中包含范围(1,21)中先前数字的总和。所以列表应该是这样的(1,1 + 2,1 + 2 + 3等)

5 个答案:

答案 0 :(得分:2)

l = range(1, 21)
print ([sum(l[:i]) for i in l])
#Output:
#[1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190, 210]

要使其成为任何列表的通用名称,请转到

l = [3,4,5,6,7,12] # or l = range(1, 21)
print ([sum(l[:i]) for i in range(1,len(l)+1)])
#Output:
#[3, 7, 12, 18, 25, 37]

答案 1 :(得分:0)

>>> MyList = []
>>> for i in range(1 + 1,21):
...   partial_sum = 0
...   for j in range(1,i):
...     partial_sum += j
...   MyList.append(partial_sum)
...
>>> MyList
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 66, 78, 91, 105, 120, 136, 153, 171, 190]

我在外部1+1循环中使用for来阻止列表开头的0。我正在使用一笔金额来证明我将其视为start + 1,而不是与1不同的起点。

不是这是实现此目的的最佳方式,但只使用简单的循环和range(),它是有效且相当简单的理解。使用sum()和/或reduce()可以产生更好的解决方案,但这超出了问题的范围。

答案 2 :(得分:0)

您可以对此问题应用递归方法:

let margin = {top: 20, right: 20, bottom:100, left:60}
let width = 800 - margin.left - margin.right
let height = 500 - margin.top - margin.bottom
let x = d3.scaleBand()
    .rangeRound([0, width])
    .padding(0.5);
let y = d3.scaleLinear().range([height, 0])

let xAxis = d3.axisBottom(x)
  .tickFormat((d) => { 
    return d.x;
  });

let yAxis = d3.axisLeft(y)

let svg = d3.select('.barGraph')
  .append('svg')
  .attr('width', width + margin.left + margin.right)
  .attr('height', height + margin.top + margin.bottom)
  .append('g')
  .attr('transform', 'translate(" + margin.left + "." + margin.top + ")');

d3.json('https://api.myjson.com/bins/vkbjf', (data)=>{
  x.domain(data.map((d)=>{
    return d.name
  }))

  y.domain([0, d3.max(data, (d)=>{
    return d.rank
  })]);

  svg.append('g')
    .attr('class', 'x axis')
    .attr('tranform', 'translate(0 " + height + ")')
    .call(xAxis)
    .selectAll('text')
    .style('text-anchor', 'end')
    .attr('dx', '-0.5em')
    .attr('dy', '-55em')
    .attr('y', 30)
    .attr('transform', 'rotate(-45)');

  svg.append('g')
    .attr('class', 'y axis')
    .call(yAxis)
    .append('text')
    .attr('transform', 'rotate(-90)')
    .attr('y', 5)
    .attr('dy', '0.8em')
    .attr('text-anchor', 'end')
    .text('Member Rank')

  svg.selectAll('bar')
    .data(data)
    .enter()
    .append('rect')
    .style('fill', 'orange')
    .attr('x', (d)=>{
      return y(d.rank)
    })
    .attr('height', (d)=>{
      return height - y(d.rank)
    })
})

答案 3 :(得分:0)

它被称为前缀sums 累积和。使用numpy轻松完成,这是数字计算的事实标准。

import numpy as np
data = range(1, 21)
print(np.cumsum(data))

答案 4 :(得分:0)

胜利的标准库!

import itertools
x = range(1, 5)
list(itertools.accumulate(x))

输出:

[1, 3, 6, 10]