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

时间:2014-01-19 23:59:33

标签: python list python-2.7

我的首发列表(“{tag}”为[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
  • 中存在[Ann]text时才移除[A(nn + 2)]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
[]

我意识到它可能类似于删除重复,但我无法在任何尝试中匹配条件。

提前感谢所有人。

1 个答案:

答案 0 :(得分:1)

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

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

You can use any number of ways to correctly pad the string with zeros to the required widths.

例如:

>>> '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,但列表理解已经很长了。