繁体   English   中英

Python-仅当存在具有更大“标签”的另一个项目时,才从列表中删除“已标记”项目

[英]Python - Remove “tagged” item from list only if another item with greater “tag” exists

我的起始列表(带有“标记”项的[Ann]nn是2位数的整数):

myList ['[A01]apple', '[A02]apple_sauce', '[A03]apple_juice', '[A04]banana', '[A05]banana_bread', '[A06]banana_ice']

我的目标清单:

myTgtList  ['[A02]apple_sauce', '[A03]apple_juice', '[A05]banana_bread', '[A06]banana_icecream']

我的目标 :

  • 仅当myList中存在[A(nn + 2)]text时,才删除[Ann]text

我的尝试:

>>> for val in myList:
...     if ('[A' + str((int(val[2:4]) + 2)) + ']') in val:
...         print val
... 
>>> for val in myList:
...     if ('[A' + str((int(val[2:4]) + 2)) + ']') in myList:
...         print val
...     
>>> for val in myList:
...     if ('[A' + str((int(val[2:4]) + 2)) + ']') in enumerate(myList):
...         print val
...     
>>> newList = [s for s in myList if ('[A' + str((int(val[2:4]) + 2)) + ']') in myList]
>>> newList
[]
>>> newList = [s for s in myList if ('[A' + str((int(val[2:4]) + 2)) + ']')]
>>> newList
[]

我意识到这可能类似于删除重复项,但是我在任何尝试中都无法满足条件。

在此先感谢所有人。

问题出在代码的这一部分:

str((int(val[2:4]) + 2)) 

注意:

>>> x="A02"
>>> x[1:3]
'02'
>>> int(x[1:3])
2
>>> str(int(x[1:3]))
'2'
>>> 'A'+str(int(x[1:3]))
'A2'

这意味着您的代码永远不会匹配,因为A2不在任何标记中,只有A02不在。

您可以使用多种方法正确地将零填充为所需宽度的字符串。

例如:

>>> 'A%02d'%(int(x[1:3]))
'A02'
>>> 'A{0:02d}'.format(int(x[1:3]))
'A02'

这是一个工作示例:

>>> l = ['[A01]apple', '[A02]apple_sauce', '[A03]apple_juice', '[B01]banana', '[A02]banana_bread', '[A03]banana_ice']
>>> [s for s in l if 'A%02d'%(int(s[2:4]) + 2) not in [t[1:4] for t in l]]
['[A02]apple_sauce', '[A03]apple_juice', '[A02]banana_bread', '[A03]banana_ice']

通常我会在%语法上使用String.format ,但是列表理解已经变得很长了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM