【问题标题】:Loop to gradually to remove elements to dictionary in Python循环以逐渐将元素删除到Python中的字典
【发布时间】:2021-09-23 22:49:59
【问题描述】:

我有一本字典,例如:

new_dict = {
    0: ['1'], 
    1: ['1', '2'], 
    2: ['1', '2', '3'], 
    3: ['1', '2', '3', '4'], 
    4: ['1', '2', '3', '4', '5'], 
    5: ['1', '2', '3', '4', '5', '6']
}

这些值只是逐渐附加的,意味着下一个值包含前一个值的元素+它自己的值。

我的问题是,我怎样才能从 key=3 开始,逐步删除所有的起始值?

例如,对于 key=3,在代码之后新的 key=3 应该如下所示:

3: ['2', '3', '4'] #Should remove the value of key=0

那么对于 key=4,新的 key=4 应该如下所示:

4: ['3', '4', '5'] #Should remove the value of key=1

以此类推,直到 new_dict 结束。

【问题讨论】:

  • 您是否需要代码来从现有字典中删除此类项目,或者您是否正在寻找代码以在给定某些起始值的情况下生成此类字典(这会更容易)?你自己试过什么?
  • 这样的dict在什么场景下有用?
  • Grismar,任何一个选项都行,感谢您的提问!
  • 雷洋,我正在收集数据来计算银行客户在12个月内违约的LGD。为了使收集更容易,我从大量客户号码中提取信息,以便一次完成所有工作。由于我只需要 12 个月(在这种情况下,键是日期和值 - 客户 ID),我必须从块中删除超过 12 个月的客户。希望我能正确解释这一点

标签: python python-3.x list loops dictionary


【解决方案1】:

基于理解的更短的解决方案:

new_dict = {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['1', '2', '3', '4'], 4: ['1', '2', '3', '4', '5'], 5: ['1', '2', '3', '4', '5', '6']}
c = 0
r = {a:b if a < 3 else b[(c:=c+1):] for a, b in new_dict.items()}

输出:

{0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['2', '3', '4'], 4: ['3', '4', '5'], 5: ['4', '5', '6']}

【讨论】:

    【解决方案2】:

    如果这对您很重要,这应该可以完成工作并且效率也很高:

    new_dict = {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['1', '2', '3', '4'], 4: ['1', '2', '3', '4', '5'], 5: ['1', '2', '3', '4', '5', '6']}
    print({key:(value,value[key-2:])[key//3] for key,value in new_dict.items()})
    >>> {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['2', '3', '4'], 4: ['3', '4', '5'], 5: ['4', '5', '6']}
    

    【讨论】:

      【解决方案3】:

      这是一个相对紧凑的解决方案:

      new_dict = {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['1', '2', '3', '4'], 4: ['1', '2', '3', '4', '5'], 5: ['1', '2', '3', '4', '5', '6']}
      up_dict={i:[item  for item in new_dict[i] if item not in new_dict[i-3]] if i>2 else new_dict[i] for i in new_dict}
      print(up_dict)
      

      输出:

      {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['2', '3', '4'], 4: ['3', '4', '5'], 5: ['4', '5', '6']}
      

      【讨论】:

      • 不错的答案。我认为操作也希望它也包含以前的 (0, 1, 2) 未修改的键值对。
      • 这正是我所需要的,谢谢!
      • @David,非常欢迎!考虑接受并投票赞成答案
      【解决方案4】:

      您可以遍历项目并将列表重新分配给最后三个元素:

      In [1]: new_dict = {0: ['1'], 1: ['1', '2'], 2: ['1', '2', '3'], 3: ['1', '2', '3', '4'], 4: ['1', '2', '3', '4', '5'], 5: ['1', '2', '3', '4', '5', '6']}
      
      
      In [2]: for k, v in new_dict.items():
         ...:     if len(v) > 3:
         ...:         new_dict[k] = v[-3:]
         ...:
      
      In [3]: new_dict
      Out[3]:
      {0: ['1'],
       1: ['1', '2'],
       2: ['1', '2', '3'],
       3: ['2', '3', '4'],
       4: ['3', '4', '5'],
       5: ['4', '5', '6']}
      

      作为字典理解:

      out_dict = {k: v[-3:] if len(v) > 3 else v for k, v in new_dict.items()}
      

      【讨论】:

        【解决方案5】:

        您可以使用字典推导,如果 key

        {k:new_dict[k] if idx<0 else [i 
                                      for i in new_dict[k] if i not in new_dict[idx]] 
         for idx,k in enumerate(new_dict, -3)}
        

        输出:

        {0: ['1'],
         1: ['1', '2'],
         2: ['1', '2', '3'],
         3: ['2', '3', '4'],
         4: ['3', '4', '5'],
         5: ['4', '5', '6']}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-05-04
          • 2023-03-16
          • 1970-01-01
          • 2019-02-03
          • 2020-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多