我有一个数字列表,例如numbers = [3,7,9,10]
,我想有一个列表
包含相邻元素之间的差异-必须具有一个
较少元素-在给定的情况下diffs = [4,2,1]
我当然可以创建一个新列表,然后遍历输入列表并编译我的 手动结果。
我正在寻找一种优雅/功能化(更不用说pythonic)的方式来做到这一点。
在Python中,您可以编写[j-i for i, j in zip(t[:-1], t[1:])]
或使用numpy
为此。
JavaScript中也有reduce()
/ list理解方法吗?
答案 0 :(得分:4)
您可以切片并映射差异。
var numbers = [3, 7, 9, 10],
result = numbers.slice(1).map((v, i) => v - numbers[i]);
console.log(result);
一种反向方法,随后进行切片。
var numbers = [3, 7, 9, 10],
result = numbers.map((b, i, { [i - 1]: a }) => b - a).slice(1);
console.log(result);
答案 1 :(得分:1)
您可以使用reduce
方法
const numbers = [3, 7, 9, 10]
const res = numbers.reduce((r, e, i, a) => i ? r.concat(e - a[i - 1]) : r, []);
console.log(res)
答案 2 :(得分:1)
您也可以在地图后弹出:
var numbers = [3, 7, 9, 10],
result = numbers.map((v, i) => numbers[i+1]-v);
result.pop()
console.log(result);
答案 3 :(得分:1)
您可以使用map
和slice
const numbers = [3, 7, 9, 10, 11, 13];
const res = numbers.map((num, index) => numbers[index + 1] - num).slice(0, -1);
console.log(res)
答案 4 :(得分:1)
您可以使用解构分配和递归-
const diff = ([ a, b, ...more ]) =>
b === undefined
? []
: [ b - a, ...diff ([ b, ...more ]) ]
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]
console .log (diff ([ 3 ]))
// []
console .log (diff ([]))
// []
或通过使用索引跳过一些中间值-
const diff = (a = [], i = 1) =>
i >= a.length
? []
: [ a[i] - a[i - 1], ...diff (a, i + 1) ]
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]
console .log (diff ([ 3 ]))
// []
console .log (diff ([]))
// []
如果需要,请使用loop
和recur
使其具有堆栈安全性。这也运行得非常快-
const recur = (...values) =>
({ recur, values })
const loop = f =>
{ let r = f ()
while (r && r.recur === recur)
r = f (...r.values)
return r
}
const push = (a = [], v) =>
( a .push (v)
, a
)
const diff = (a = []) =>
loop
( ( i = 1
, r = []
) =>
i >= a.length
? r
: recur
( i + 1
, push (r, a[i] - a[i - 1])
)
)
console .log (diff ([ 3, 7, 9, 10 ]))
// [ 4, 2, 1 ]
console .log (diff ([ 3 ]))
// []
console .log (diff ([]))
// []
答案 5 :(得分:0)
您可以切片(以0开头,-1跳过最后一个项目)并进行映射,以便按顺序生成元素与其后继元素之间的差异:
const items = [3,7,9,10];
console.log(items.slice(0,-1).map((e,i)=>items[i+1]-e))