【问题标题】:How to remove dictionary items in list based on values in string如何根据字符串中的值删除列表中的字典项
【发布时间】:2019-04-16 11:36:39
【问题描述】:

我正忙着用 python 2.7 提取数据 到目前为止,我得到了一个以字典为项目的列表。 两天来,我对此无法进一步了解。

数据:

list = [
    {
        'displayName': '#12',
        'timestamp': 1543588481684,
        'number': 12,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #12'
    },
    {   
        'displayName': '#64',
        'timestamp': 1544432646765,
        'number': 64,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Development Virtual Host Deploy #64'
    },
    {
        'displayName': '#15',
        'timestamp': 1544432258338,
        'number': 15,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #15'
    },
    {   
        'displayName': '#61',
        'timestamp': 1554186520499,
        'number': 61,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.0 #61'
    },
    {   
        'displayName': '#5',
        'timestamp': 1554274310468,
        'number': 5,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.2 #5'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554289674392,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.3 #1'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554290695120,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.4 #1'
    },
    {   'displayName': '#1',
        'timestamp': 1554292855198,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.5 #1'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554381545158,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.7 #1'
    },
    {   'displayName': '#2',
        'timestamp': 1554191277415,
        'number': 2,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.0 #2'
    },
    {   'displayName': '#6',
        'timestamp': 1554212133716,
        'number': 6,
        'result': 'FAILURE',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.1 #6'
    }
]

我想删除列表中的字典项,其中 'fullDisplayName' contains('hotfix','tag') 但保留最后一个列表项(具有最高版本值的字典 (hotfix/1.0.?) )。

预期输出:

list = [
    {
        'displayName': '#12',
        'timestamp': 1543588481684,
        'number': 12,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #12'
    },
    {   
        'displayName': '#64',
        'timestamp': 1544432646765,
        'number': 64,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Development Virtual Host Deploy #64'
    },
    {
        'displayName': '#15',
        'timestamp': 1544432258338,
        'number': 15,
        'result': 'SUCCESS',
        'fullDisplayName': 'Configs \xbb Virtual Host #15'
    },
    {   
        'displayName': '#1',
        'timestamp': 1554381545158,
        'number': 1,
        'result': 'SUCCESS',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb release/1.0.7 #1'
    },
    {   'displayName': '#6',
        'timestamp': 1554212133716,
        'number': 6,
        'result': 'FAILURE',
        'fullDisplayName': 'Docker \xbb Configs Deploy \xbb tag/1.0.1 #6'
    }
]

希望有人能指出正确的方向。

谢谢

【问题讨论】:

  • 那个dictcontains('hotfix','tag')是什么意思?
  • 更新了该部分。希望有意义

标签: python regex python-2.7 list data-manipulation


【解决方案1】:
  1. 寻找所需的关键字
  2. 检查更高版本
  3. 必要时删除项目

伪代码:

for item in list:
    if dictContainsKeyword(item, "hotfix") or dictContainsKeyword(item, "tag"):
        if listContainsNewerVersion(list, item):
            removeDictFromList(list, item)

对于 dictContainsKeyword、listContainsNewerVersion 和 removeDictFromList,您需要选择具有唯一值的字典属性。或者使用一组属性来识别单个字典。

在 listContainsNewerVersion 中,您可以遍历列表并将字典与给定的字典进行比较。

编辑:更改为 for each 循环以避免列表迭代和删除对象的问题。

【讨论】:

    【解决方案2】:

    您可以尝试以下方法,虽然效率不高,但可以解决您的问题

    >>> list1 = [i for i in list if 'tag' not in i['fullDisplayName']]
    >>> list2 = [i for i in list if 'tag' in i['fullDisplayName']]
    >>> from operator import itemgetter
    >>> newlist = sorted(list2, key=itemgetter('displayName'), reverse=True)
    >>> list1.append(newlist[0])
    

    【讨论】:

      【解决方案3】:

      做这样的事情:

      new_list = []
      append_last = (0, None)
      for index, obj in enumerate(list):
          if 'hotfix' in obj['fullDisplayName'] or 'tag' in obj['fullDisplayName']:
              number = int("tag/1.0.1".split('/')[1].replace('.',''))
              append_last = (number, index) if append_last[0] < number else append_last
          else:
              new_list.append(obj)
      if append_last[1]:
          new_list.append(list[append_last[1]])
      print new_list
      

      【讨论】:

        【解决方案4】:

        假设我们的原始文件名为my_list,我们需要限制的值存储在restricted

        my_list = [
            {
                'displayName': '#12',
                'timestamp': 1543588481684,
                'number': 12,
                'result': 'SUCCESS',
                'fullDisplayName': 'Configs \xbb Virtual Host #12'
            },
            ...
        ]
        restricted = ['hotfix','tag']
        

        首先我们需要找到编号最大的字典,我们将使用max() 并设置key 根据['number'] 的最大值查找字典。

        highest = max(my_list, key=lambda x: x['number'])
        

        我们可以使用 python 内置函数filter() 来过滤掉特定的字典。为此,我们将定义一个函数来决定某些字典是否有效,这里是my_filter()

        def my_filter(x):
            # check if provided dict is one with the highest value
            if x == highest:
                return True
        
            # check if ['fullDisplayName'] doesn't contains any of resticted words
            if not any(i in x['fullDisplayName'] for i in restricted):
                return True
        
            return False
        
        new_list = list(filter(my_filter, my_list))
        

        或者在一行中使用过滤函数作为lambda

        new_list = list(filter(lambda x: x==highest or not any(i in x['fullDisplayName'] for i in restricted), my_list))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-06
          • 2019-06-04
          • 1970-01-01
          • 2016-03-13
          • 1970-01-01
          相关资源
          最近更新 更多