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

Python实现:从键值对列表中删除指定day区间的元素

Python实现删除键值对列表中指定键区间的元素

给定如下键值对列表:

[{"day": 1, "sum": 25, "type": "in"}, {"day": 2, "sum": 55, "type": "in"}, {"day": 3, "sum": 154, "type": "out"}, {"day": 4, "sum": 99, "type": "in"}]

需求是删除"day"值在指定区间(例如1到3)内的所有元素,已有UI代码,仅需完善delete_transaction_interval(all_transactions, dayStart, dayEnd)函数。

原代码存在的问题

  1. 语法错误:字典中type对应的in是Python关键字,必须用字符串引号包裹,否则会触发语法报错
  2. 逻辑缺陷:仅删除从dayStart对应索引到dayEnd对应索引之前的元素,不包含dayEnd本身;若列表未按day顺序排列,或dayStart/dayEnd不存在,函数完全失效
  3. 遍历风险:正向遍历列表时直接删除元素会导致索引错位,后续元素无法被正确遍历

解决方案

方案1:创建新列表(推荐)

通过列表推导式筛选出符合条件的元素,返回新列表,避免索引混乱问题:

all_transactions = [{"day": 1, "sum": 25, "type": "in"}, {"day": 2, "sum": 55, "type": "in"}, {"day": 3, "sum": 154, "type": "out"}, {"day": 4, "sum": 99, "type": "in"}]

def delete_transaction_interval(all_transactions, dayStart, dayEnd):
    # 保留day不在[dayStart, dayEnd]区间内的元素
    return [item for item in all_transactions if not (dayStart <= item["day"] <= dayEnd)]

def ui_delete_transaction_interval(all_transactions):
    dayStart = int(input("Start day= "))
    dayEnd = int(input("End day= "))
    global all_transactions
    all_transactions = delete_transaction_interval(all_transactions, dayStart, dayEnd)

ui_delete_transaction_interval(all_transactions)
print(all_transactions)

方案2:原地删除(倒序遍历)

若需要直接修改原列表,采用倒序遍历的方式,避免删除元素后索引错位:

all_transactions = [{"day": 1, "sum": 25, "type": "in"}, {"day": 2, "sum": 55, "type": "in"}, {"day": 3, "sum": 154, "type": "out"}, {"day": 4, "sum": 99, "type": "in"}]

def delete_transaction_interval(all_transactions, dayStart, dayEnd):
    # 倒序遍历索引,防止删除元素后后续索引偏移
    for i in range(len(all_transactions)-1, -1, -1):
        if dayStart <= all_transactions[i]["day"] <= dayEnd:
            del all_transactions[i]

def ui_delete_transaction_interval(all_transactions):
    dayStart = int(input("Start day= "))
    dayEnd = int(input("End day= "))
    delete_transaction_interval(all_transactions, dayStart, dayEnd)

ui_delete_transaction_interval(all_transactions)
print(all_transactions)

方案说明

  • 方案1代码简洁、逻辑清晰,不会影响原列表的其他引用,适合绝大多数场景
  • 方案2直接修改原列表,内存占用更低,适合处理大型列表且需要原地修改的场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:55:27