在Python列表中执行复杂循环

时间:2018-02-03 19:19:36

标签: python python-2.7

我有一个字符串列表,例如:

   subject = ['HYB option 1Y10Y STY L op in COP 4 23bps at 2 12bps (hu)',
               'HYB option 1Y10Y SOP Linked op in CHY 0 045% at 0 065%',
               'HYB option Lip 3M10Y SPX Linked op in BRR 0 00bp at +0 25bp',
               'HYB option 2Y15Y NFU Linked op in JPY 0 0498% at 0 0975% (765)',               
               'HYB option 1Y10Y SxX Lked op in USD 5 75bps at 2 34bps',
               'THYB optionSp 9M10Y SX5E Led op in COP 0 065%',
               'HYB option 1Y5Y DEE Likd op in EUR 23bp at 1 76bp (ba3)']

我试图找到一种循环遍历此列表并进行替换和乘法运算的方法。

更具体地说,我如何进行循环,当我有一个数字后跟bpsbp时,我将乘以100并替换bps或{{1 } bp

我已经尝试过使用不同的循环方法,但它们都没有工作。发生的事情是,当我进行乘法时,我不能用%bp隔离它,并且它也会将乘法应用于bps的乘法。

1 个答案:

答案 0 :(得分:6)

以下是基于regular expressions with a callback function的解决方案:

>>> import re
>>> for s in subject:
...   print(re.sub(r"(\d)bps?", lambda m: "%d%%" % (int(m.group(1))*100), s))
... 
HYB option 1Y10Y STY L op in COP 4 2300% at 2 1200% (hu)
HYB option 1Y10Y SOP Linked op in CHY 0 045% at 0 065%
HYB option Lip 3M10Y SPX Linked op in BRR 0 0% at +0 2500%
HYB option 2Y15Y NFU Linked op in JPY 0 0498% at 0 0975% (765)
HYB option 1Y10Y SxX Lked op in USD 5 7500% at 2 3400%
THYB optionSp 9M10Y SX5E Led op in COP 0 065%
HYB option 1Y5Y DEE Likd op in EUR 2300% at 1 7600% (ba3)

简要说明:re.sub()采用正则表达式,只要匹配(\d =任意数字),就会将其发送到回调函数(此处:执行作业的lambda:convert到int,乘以100,加上百分号)。然后匹配由回调函数返回的字符串替换。

因此,每次有bpbps后面的数字(问号使s可选)时,该数字将传递给返回字符串{{1}的函数}。 for循环遍历列表中的字符串,并将number*100%应用于每个元素。