将数字平均分配到数组的各个元素上(并将余数添加到环的开头)

时间:2018-08-23 18:55:53

标签: json jq

假设我有一些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分。

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并将数组作为输入。