You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:使用Python对DynamoDB非排序键日期列降序排序

问题与解决方案:DynamoDB查询结果按ID分组并按日期列降序排序

问题背景

作为DynamoDB和Python新手,需要查询DynamoDB数据并按非排序键的日期列(字符串格式YYYYMMDD_HHMMSS)降序排序。使用Boto3的query方法获取数据后,无法通过DynamoDB原生查询实现该排序逻辑,需在Python中对返回的result["items"]进行处理,要求:

  • 先按id字段分组
  • 每组内按dateColumn字段降序排列

查询代码:

result = TABLE.query(
    KeyConditionExpression="partitionKey = :pk",
    ExpressionAttributeValues={
        ":pk": partitionKey
    }
)

原始数据示例:

[
    {
        "id": "colV",
        "dateColumn": "20231104_122600"
    },
    {
        "id": "colV",
        "dateColumn": "20231105_122600"
    },
    {
        "id": "colX",
        "dateColumn": "20231114_122600"
    },
    {
        "id": "colX",
        "dateColumn": "20231105_122600"
    }
]

期望结果:

[
    {
        "id": "colV",
        "dateColumn": "20231105_122600"
    },
    {
        "id": "colV",
        "dateColumn": "20231104_122600"
    },
    {
        "id": "colX",
        "dateColumn": "20231114_122600"
    },
    {
        "id": "colX",
        "dateColumn": "20231105_122600"
    }
]

解决方案

由于dateColumn采用YYYYMMDD_HHMMSS格式的字符串,其字典序与时间顺序完全一致,无需转换为datetime对象即可直接排序。以下提供两种实现方式:

方法1:使用字典分组(保留原始ID出现顺序)

from collections import defaultdict

# 获取查询返回的items
items = result["items"]

# 步骤1:按id分组
grouped_items = defaultdict(list)
for item in items:
    grouped_items[item["id"]].append(item)

# 步骤2:每组内按dateColumn降序排序
for id_key in grouped_items:
    grouped_items[id_key].sort(key=lambda x: x["dateColumn"], reverse=True)

# 步骤3:按原始数据中id的出现顺序合并结果
sorted_result = []
seen_ids = []
for item in items:
    current_id = item["id"]
    if current_id not in seen_ids:
        seen_ids.append(current_id)

for id_key in seen_ids:
    sorted_result.extend(grouped_items[id_key])

方法2:使用itertools.groupby(需先按ID排序)

from itertools import groupby

# 获取查询返回的items
items = result["items"]

# 先按id排序,确保groupby能正确分组
sorted_by_id = sorted(items, key=lambda x: x["id"])

# 分组并对每组内数据降序排序
sorted_result = []
for id_key, group in groupby(sorted_by_id, key=lambda x: x["id"]):
    # 对当前组按dateColumn降序排列
    sorted_group = sorted(group, key=lambda x: x["dateColumn"], reverse=True)
    sorted_result.extend(sorted_group)

两种方法最终都会得到符合要求的排序结果,方法1会保留原始数据中id首次出现的顺序,方法2则会按id的字典序排列分组。


内容的提问来源于stack exchange,提问作者Vishu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:13:23