【问题标题】:Sort a json file in python在python中对json文件进行排序
【发布时间】:2020-11-21 04:17:00
【问题描述】:

我有一个长字符串列表,我想以特定形式打印输出。 convert list to a particular json in python

但是在数据的转换顺序改变之后。如何保持相同的顺序?

input_data = 

 [
  "21:15-21:30 IllegalAgrumentsException 1,
   21:15-21:30 NullPointerException 2,
   22:00-22:15 UserNotFoundException 1,
   22:15-22:30 NullPointerException 1
   ....."
]

以特定 json 形式隐藏数据的代码:

    input_data = input[0]   // input is list of single long string.
    input_data = re.split(r',\s*', input_data)
    output = collections.defaultdict(collections.Counter)
    # print(output)
    for line in input_data:
        time, error, count = line.split(None, 2)
        output[time][error] += int(count)
    print(output)
    response = [
        {
            "time": time,
            "logs": [
                {"exception": exception, "count": count}
                for (exception, count) in counter.items()
            ],
        }
        for (time, counter) in output.items())
    ]

    print(response) 

我的输出:

{
    "response": [
        {
          "logs": [
            {
                "count": 1,
                "exception": "UserNotFoundException"
            }
        ],
        "time": "22:45-23:00"
    },
    {
        "logs": [
            {
                "count": 1,
                "exception": "NullPointerException"
            }
        ],
        "time": "23:00-23:15"
    }...
 ]
}

所以我的订单发生了变化,但我需要我的数据保持相同的顺序,即从21:15-21:30 开始等等。我怎样才能保持相同的顺序?

【问题讨论】:

标签: python arrays json python-3.x list


【解决方案1】:

您的时间戳已经是可排序的,所以如果您不关心个别异常的顺序,您可以这样做:

for (time, counter) in sorted(output.items())

它将按time 然后按计数进行字典排序。如果您只想按时间排序,您可以使用sorted(output.items(), key=lambda x: x[0]),或者使用key=lambda x: x[0], -x[1] 按时间和降序计数。

【讨论】:

  • 这将按时间排序,就像 -> 0:00-0:15 和我的数据来自 21:15-21:30 所以没有意义。
【解决方案2】:

数据被读入字典,准确地说是defaultdict

output[time][error] += int(count)

这个数据结构是按时间和错误类型对数据进行分组,这意味着可能有多个项目具有相同的时间和相同的错误时间。如果数据像这样重新组合,就不可能有“相同的顺序”。

另一方面,您可能希望时间在输入中排序,即使不是,您希望输出按时间排序,你只需要这样做,所以不要这样做:

for (time, counter) in output.items()

这样做:

for time in sorted(output)

然后将counter作为

counter = output[time]

编辑: 时间已排序,但不是从 0:00 开始,按时间字符串排序不正确。而是按照原来的时间顺序来排序是正确的。

因此,记住原来的时间顺序:

time_order = []

for line in input_data:
    time, error, count = line.split(None, 2)
    output[time][error] += int(count)
    time_order.append(time)

然后按它排序:

for time in sorted(output, key=time_order.index)

【讨论】:

  • 我的输入已经按时间排序,如果在某个时间范围内,存在多个异常,则在该时间范围内按字典顺序对异常名称进行排序。
  • 所以我的输入数据本身是排序的,不需要任何东西,但是当我做以下操作顺序更改时,即使我按时间排序,它也会从 0:00-0:15 开始这是我不想要的。
  • @kelte 好的...我也为此添加了解决方案;)
猜你喜欢
  • 1970-01-01
  • 2023-03-30
  • 2015-06-14
  • 2018-02-12
  • 2020-03-16
  • 2017-10-22
  • 1970-01-01
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多