迭代问题

时间:2017-06-11 09:59:00

标签: python iteration

我正在巴黎开展一项名为Velib的自行​​车共享计划。下面显示的R_0列表包含巴黎所有自行车站的所有信息,我试图量化每个自行车站在一定时间内自行车价值的变化,以查看哪个自行车站拥有最多的用户和等等。

lR0是R_0的长度。我做的是制作2个列表,然后迭代。第一个列表Lt0包含时间t的自行车的值和时间t + T的第二个列表Lt1,我创建了一个新的列表I_0,在时间T中添加了自行车的abs(变化)。所以最后我会得到一个列表,其中包含整个时期内自行车的近似变化(如果T - > 0,则会给出确切的变化)。

不幸的是,我的列表I_0对于所有迭代都是[0,0,...,0,0],即使我在每次迭代时刷新每个站点的自行车数量。刷新R_0有问题吗? python实际上是否每次使用从网站发回的旧j子列表?我的代码顺序是否有问题?

I_0=np.zeros(lR0)

Lt1=np.zeros(lR0)

for k in range (0,lR0-1):
    Lt1[k]=R_0[k]['available_bikes']

Lt0=Lt1    

c=0

while c<288:

    c=c+1
    R_0_json = requests.get('https://api.jcdecaux.com/vls/v1/stations?contract=Paris&apiKey=an apikey')
    R_0=R_0_json.json()
    lR0=len(R_0)

    for k in range (0,lR0-1):
        I_0[k]=I_0[k]+abs(Lt1[k]-Lt0[k])
        Lt0[k]=Lt1[k]
        Lt1[k]=R_0[k]['available_bikes']

        time.sleep (150)


print(I_0)

R_0看起来像这样:

[{'last_update': 1497175405000, 'status': 'OPEN', 'bike_stands': 50, 'banking': 
True, 'available_bikes': 6, 'name': '31705 - CHAMPEAUX (BAGNOLET)', 'bonus': Tru
e, 'number': 31705, 'contract_name': 'Paris', 'address': 'RUE DES CHAMPEAUX (PRE
S DE LA GARE ROUTIERE) - 93170 BAGNOLET', 'position': {'lng': 2.416170724425901,
 'lat': 48.8645278209514}, 'available_bike_stands': 43}, {'last_update': 1497175
566000, 'status': 'OPEN', 'bike_stands': 33, 'banking': True, 'available_bikes':
 17, 'name': '10042 - POISSONNIÈRE - ENGHIEN', 'bonus': False, 'number': 10042, 
'contract_name': 'Paris', 'address': "52 RUE D'ENGHIEN / ANGLE RUE DU FAUBOURG P
OISSONIERE - 75010 PARIS", 'position': {'lng': 2.348395236282807, 'lat': 48.8724
2006305313}, 'available_bike_stands': 15}, ...]

1 个答案:

答案 0 :(得分:0)

您可以尝试以下方式:

I_0.values()

如果您只是对值感兴趣而不是对站的映射感兴趣,那么您可以使用I_0 = [0] * len(R_0) for c in xrange(288): R_0 = get_json() for k, station in enumerate(R_0): available_bikes_now = station['available_bikes'] I_0[k] += abs(available_bikes_now - available_bikes_before[station['name']]) available_bikes_before[station['name']] = available_bikes_now time.sleep(150) print(I_0) 来访问这些值。但是,它们不会以可预测的方式进行排序。如果订单很重要,您可以像这样修改上面的代码:

var arr = [1,2,4,5,1,7,8,9,2,3]
MAX_SUM = 10,
MIN_SUBSET_LEN = 2,
RESULT_LEN = 5;

//remove duplicates
var uniqeSet = arr.filter(function(value, index){ 
  return this.indexOf(value) == index 
},arr);

// a function to get all subset which 
// their length are greater than minLength and 
// sum of values are little than maxSum
var combine = function(sourceArr, minLength, maxSum) {
    var fn = function(n, src, got, all, sum) {
        if(sum <= maxSum){
          if (n == 0) {
            if (got.length > 0) {
                all.push({arr:got,sum:sum});
            }
            return;
          }
          for (var j = 0; j < src.length; j++) {
            var tempSum = sum
            fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all, sum + src[j]);
          }
        }
        return;
    }
    
    var all = [];
    for (var i = minLength; i < sourceArr.length; i++) {
        fn(i, sourceArr, [], all, 0);
    }
    return all;
}


var result = combine(uniqeSet, MIN_SUBSET_LEN, MAX_SUM);

var sortedSliced = result.sort(function(a1, a2){
  return a2.sum - a1.sum;
}).slice(0, RESULT_LEN).map(function(m){return m.arr;});

console.log(JSON.stringify(sortedSliced));

请注意I_0的更改:它现在是一个列表,我们使用索引k来填充其值。其余代码保持不变。