获取列表中任意两个连续元素之间的最大差异的Pythonic方法

时间:2019-08-06 11:23:23

标签: python list list-comprehension

我有一个列表,其中存储了轮流玩的游戏的分数。在每个索引处,分数的存储方式都等于该分数在该回合之前(包括该回合)的总分数。

  • 本轮1-5分得分
  • 第2轮-本轮得分3
  • 第3轮-本轮得分7
  • 第4轮-本轮得分4

这将导致

total_score = [5, 8, 15, 19]

如何将其整齐地转换成一个列表,其中包含每个索引在每个回合中的得分,而不是该回合之前的总得分。

所以我想把上面的列表变成:

round_scores = [5, 3, 7, 4]

仅遍历它并从当前索引的分数中减去前一个索引的分数并不特别困难。但是,有没有更整洁的方法来做到这一点?也许一个班轮名单理解?我对Python还是很陌生,但是在其他答案中却看到我在一行中完成了一些魔术。

4 个答案:

答案 0 :(得分:1)

x = [5, 8, 15, 19]  # total scores
y = [x[i] - x[i-1] if i else x[i] for i in range(len(x))]  # round scores
print(y)
# output
[5, 3, 7, 4]

答案 1 :(得分:1)

使用numpy,

$rootScope.$on('$stateChangeSuccess', function (event, toState, toParams, fromState, fromParams) {
                if (toState.name === 'app.message') {
                    event.preventDefault();
                    $state.go('app.message.draft');
                    return;
                }
            });

答案 2 :(得分:0)

您可以将zip用于列表理解:

[total_score[0]] + [abs(x - y) for x, y in zip(total_score, total_score[1:])]

示例

total_score = [5, 8, 15, 19]

print([total_score[0]] + [abs(x - y) for x, y in zip(total_score, total_score[1:])])
# [5, 3, 7, 4]

答案 3 :(得分:0)

您可以遍历索引:

round_score = [total_score[0]]
round_score += [total_score[i] - total_score[i-1] for i in range(1, len(total_score))]

或者通过少量预处理使其表达为一个表达式:

temp = [0] + total_score

round_score = [temp[i] - temp[i-1] for i in range(1, len(temp))]