python - python 如何根据字符串中的值移除列表中的字典项

我正忙着用 python 2.7提取数据到目前我得到了一个字典作为项目。 对于 2天,我无法进一步了解。

数据:


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 '包含('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'


 }


]



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

谢谢你

时间:

  • 查找所需关键字
  • 检查更高版本
  • 必要时移除项目

伪代码:


for item in list:


 if dictContainsKeyword(item,"hotfix") or dictContainsKeyword(item,"tag"):


 if listContainsNewerVersion(list, item):


 removeDictFromList(list, item)



对于 dictContainsKeyword,listContainsNewerVersion和 removeDictFromList,你需要选择字典的属性,该属性具有惟一的值。 或者使用一组属性来标识单个字典。

在listContainsNewerVersion中,你可以遍历列表,并将字典与给定的。

编辑:为了避免列表迭代和删除对象而发生的每个循环的更改。

你可以尝试以下方法,不是非常有效,但它会解决你的问题


>>> 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])



请执行如下操作:


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



假设我们的原始名是 my_list,而我们需要限制的值存储在 restricted


my_list = [


 {


 'displayName': '#12',


 'timestamp': 1543588481684,


 'number': 12,


 'result': 'SUCCESS',


 'fullDisplayName': 'Configs xbb Virtual Host #12'


 },


. . .


]


restricted = ['hotfix','tag']



首先,我们需要找到最高数量的字典,我们将使用 max(),并设置 key 来查找基于最高值的字典。


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))



...