合并字典中的重复值

Merge duplicate values in a dictionary

我想创建一个合并重复时间跨度的新字典。使用包含相似工作日列表的字典键 weekdays 和包含时间跨度的键 time_span

输入:

{
   "0":[
      [
         "09:00:00",
         "12:00:00"
      ]
   ],
   "1":[
      [
         "09:00:00",
         "12:00:00"
      ]
   ],
   "2":[
      [
         "09:00:00",
         "12:00:00"
      ],
      [
         "12:30:00",
         "15:30:00"
      ]
   ],
   "3":[
      [
         "09:00:00",
         "12:00:00"
      ]
   ],
   "4":[
      [
         "09:00:00",
         "12:00:00"
      ]
   ],
   "5":[
      [
         "09:00:00",
         "12:00:00"
      ],
      [
         "12:30:00",
         "15:30:00"
      ]
   ],
   "6":[
      [
         "09:00:00",
         "12:00:00"
      ],
      [
         "12:30:00",
         "15:30:00"
      ]
   ]
}

期望的输出:

[
   {
      "weekdays":[0, 1, 3, 4],
      "time_spans":[
         [
            "09:00:00",
            "12:00:00"
         ]
      ]
   },
   {
      "weekdays":[2, 5, 6],
      "time_spans":[
         [
            "09:00:00",
            "12:00:00"
         ],
         [
            "12:30:00",
            "15:30:00"
         ]
      ]
   }
]

如果这个问题有更好的解决方案,我洗耳恭听。

我找到的解决方案不起作用,它们假定 dict 的值不是列表。流行的解决方案似乎是翻转键和值。

例如:Find dictionary keys with duplicate values

我想我太迟钝了,看不到明显的解决方案...

与您找到的既定解决方案类似,您可以将列表(和列表的列表)的表示形式存储为字符串,这使得将它们用作字典键变得简单。

def timesheetMerge(timesheet):
    output = []
    unique_shifts = {}
    for key, val in timesheet.items():
        if str(val) not in unique_shifts.keys():
            unique_shifts[str(val)] = len(output)
            output.append({"weekdays": [int(key)], "time_spans": val})
        else:
            output[unique_shifts[str(val)]]["weekdays"].append(int(key))

    return output