假设我有一些JSON数组,我们将其称为n = int(input('Give the number of terms of the series'))
prev1 = 1
prev2 = 1
prev3 = 2
for i in range(n):
next = prev1*prev2+prev3
prev3 = next
prev2 = prev3
prev1 = prev2
print('The series is ', next)
:
A
我有一些数字["foo", "bar", "baz"]
,在这种情况下,我们说5。
我想在jq中产生以下对象:
X
这是数字5,该数字在数组的各个元素之间平均分配,其余部分分配给环开头的元素。您可能会这样想,如果{
"foo": 2,
"bar": 2,
"baz": 1,
}
,元素N
的值应为ceil(X / length(A))
,否则应为index(N) < (X % length(A))
。
假设floor(X / length(A))
是我输入到jq的文件,并且我将A
定义为变量,那么如何在jq中表示呢?
我尝试以X
作为起点,但每个元素获得2分。
答案 0 :(得分:2)
您可以使用transpose
函数来帮助构建它。使用ceil
函数更简单,我们必须定义自己。您要查找的从索引到分配的映射是ceil($count - $i)/$n)
,其中$count
是您要分配的数量,$i
是原始列表中的索引,而$n
是列表的长度。
注释显示了每个片段如何在["foo", "bar", "baz"]
的示例输入中起作用。
def ceil(v): -(-v | floor);
def objectify(n): {key: .[0], value: ceil(($count - .[1])/n)};
# ["foo", 0] | objectify(3) -> {"key": "foo", "value", 2}
length as $n | # n == 3
[., keys] | # [["foo", "bar", "baz"], [0,1,2]]
[transpose[] | # [["foo", 0], ["bar", 1], ["baz", 2]]
objectify($n)
] |
from_entries # {"foo": 2, "bar": 2, "baz": 1}
没有评论...
def ceil(v): -(-v | floor);
def objectify(n): {key: .[0], value: ceil(($count - .[1])/n)};
length as $n | [., keys] | [transpose[] | objectify($n)] | from_entries
使用示例,假设您将其保存到名为distribute.jq
的文件中:
jq --argjson count 5 -f distribute.jq tmp.json
答案 1 :(得分:-1)
我找到了一种解决方案,将原始输入保存为变量,这样我就可以在对其值进行运算时继续引用它。
. as $arr
| length as $len
| [
.[]
| . as $i
| {
$(i): (
if ($arr | index($i)) < ($x % $len) then
($x / $len) + 1
else
$x / $len
end
| floor
)
}
]
| add
以下对我有用的方法是传递--argjson count $X
并将数组作为输入。