Python:想要仅在列表中拆分项目的最后一个括号

时间:2017-01-18 13:59:23

标签: python split

我在列表中有20000个项目,并且想要一种强大而快速的方法来仅拆分列表中的最后一个括号()。有些项目有两个括号,我希望第一个括号保留。这是我目前的代码。

output = ['ADLN (ADLN.SI)',
 'CN ACCESS INDEX (TR) (SGXCN2.SI)',
 'CN ACCESS STB (10%) INDEX (SGXCN7.SI)',
 'CN ACCESS STB (5%) INDEX (SGXCN6.SI)',
 'FNGUIDE CN ACC (1X) TR IDX (SGXCN15.SI)',
 'FNGUIDE CN ACC INV 1X TR KRW IDX (SGXCN13.SI)',
 'FNGUIDE CN ACC LEV 2X TR IDX (SGXCN14.SI)',
 'FTSE ST All-Share Index (FSTAS.SI)',
 'FTSE ST Basic Materials Index (FSTAS1000.SI)',
 'FTSE ST Catalist Index (FSTICA.SI)']
mylist =[]
for x in range len(output):
    a = ouput[x].split(')')
    b = a[0].split('('))
    mylist.append(b[0])
    mylist.append(b[1])

只有当它只有一个支架时才能分开。如果两个括号,它将无法正常工作。 我想要的输出如下:

'ADLN' ,'ADLN.SI',
 'CN ACCESS INDEX (TR)', 'SGXCN2.SI',
 'CN ACCESS STB (10%) INDEX ','SGXCN7.SI',
 'CN ACCESS STB (5%) INDEX ','SGXCN6.SI',
 'FNGUIDE CN ACC (1X) TR IDX ','SGXCN15.SI',
 'FNGUIDE CN ACC INV 1X TR KRW IDX','SGXCN13.SI',
 'FNGUIDE CN ACC LEV 2X TR IDX','SGXCN14.SI',
 'FTSE ST All-Share Index','FSTAS.SI',
 'FTSE ST Basic Materials Index','FSTAS1000.SI',
 'FTSE ST Catalist Index',FSTICA.SI'

使用循环需要一些时间,如果还有更好的方法吗?

5 个答案:

答案 0 :(得分:1)

可以使用str.rpartition完成。它分为3个项目列表:左侧,分隔符和右侧。从右开始,考虑最后一个左括号。追加左右右(减去最后一个括号)到你的清单。

mylist=[]
for i in output:
    parts = i.rpartition("(")
    mylist.append(parts[0])
    mylist.append(parts[2][:-1])

print(mylist)

结果:

['ADLN ', 'ADLN.SI', 'CN ACCESS INDEX (TR) ', 'SGXCN2.SI', 'CN ACCESS STB (10%) INDEX ', 'SGXCN7.SI', 'CN ACCESS STB (5%) INDEX ', 'SGXCN6.SI', 'FNGUIDE CN ACC (1X) TR IDX ', 'SGXCN15.SI', 'FNGUIDE CN ACC INV 1X TR KRW IDX ', 'SGXCN13.SI', 'FNGUIDE CN ACC LEV 2X TR IDX ', 'SGXCN14.SI', 'FTSE ST All-Share Index ', 'FSTAS.SI', 'FTSE ST Basic Materials Index ', 'FSTAS1000.SI', 'FTSE ST Catalist Index ', 'FSTICA.SI']
使用itertools.chain.from_iterable

,在列表理解中执行此操作听起来有点困难但可行
import itertools

mylist=list(itertools.chain.from_iterable((i.rpartition("(")[0],i.rpartition("(")[2][:-1]) for i in output))

答案 1 :(得分:1)

您可以使用如下生成器实现:

output = ['ADLN (ADLN.SI)',
 'CN ACCESS INDEX (TR) (SGXCN2.SI)',
 'CN ACCESS STB (10%) INDEX (SGXCN7.SI)',
 'CN ACCESS STB (5%) INDEX (SGXCN6.SI)',
 'FNGUIDE CN ACC (1X) TR IDX (SGXCN15.SI)',
 'FNGUIDE CN ACC INV 1X TR KRW IDX (SGXCN13.SI)',
 'FNGUIDE CN ACC LEV 2X TR IDX (SGXCN14.SI)',
 'FTSE ST All-Share Index (FSTAS.SI)',
 'FTSE ST Basic Materials Index (FSTAS1000.SI)',
 'FTSE ST Catalist Index (FSTICA.SI)']

out2 = (b.strip('()') if b.startswith('(') else b for a in (a.rsplit(' ', 1) for a in output) for b in a)
list(out2)

输出:

['ADLN',
 'ADLN.SI',
 'CN ACCESS INDEX (TR)',
 'SGXCN2.SI',
 'CN ACCESS STB (10%) INDEX',
 'SGXCN7.SI',
 'CN ACCESS STB (5%) INDEX',
 'SGXCN6.SI',
 'FNGUIDE CN ACC (1X) TR IDX',
 'SGXCN15.SI',
 'FNGUIDE CN ACC INV 1X TR KRW IDX',
 'SGXCN13.SI',
 'FNGUIDE CN ACC LEV 2X TR IDX',
 'SGXCN14.SI',
 'FTSE ST All-Share Index',
 'FSTAS.SI',
 'FTSE ST Basic Materials Index',
 'FSTAS1000.SI',
 'FTSE ST Catalist Index',
 'FSTICA.SI']

答案 2 :(得分:1)

使用rsplit()

str.rsplit(sep=None, maxsplit=-1)
  

使用sep作为分隔符,返回字符串中单词的列表   串。如果给出maxsplit,则最多完成maxsplit分割,即   最右边的。如果未指定sep或None,则为任何空白字符串   是一个分隔符。

rsplit从右向左经过,您可以使用maxsplit告诉它在第一个分隔符处停止。

for text in output:
    i, j = text.rsplit(' ', 1)
    print(i, j.strip('()'))

出:

ADLN ADLN.SI
CN ACCESS INDEX (TR) SGXCN2.SI
CN ACCESS STB (10%) INDEX SGXCN7.SI
CN ACCESS STB (5%) INDEX SGXCN6.SI
FNGUIDE CN ACC (1X) TR IDX SGXCN15.SI
FNGUIDE CN ACC INV 1X TR KRW IDX SGXCN13.SI
FNGUIDE CN ACC LEV 2X TR IDX SGXCN14.SI
FTSE ST All-Share Index FSTAS.SI
FTSE ST Basic Materials Index FSTAS1000.SI
FTSE ST Catalist Index FSTICA.SI

答案 3 :(得分:0)

如前所述,我会使用rsplit,其值为value = 1 - >它只表示您提出的最后一次出现。请检查下面的代码。

mylist =[]
for x in range(len(output)):
    a = output[x].rsplit(')',1)
    b = a[0].rsplit('(',1)
    mylist.append(b[0])
    mylist.append(b[1])
print mylist

答案 4 :(得分:0)

这样可以得到你想要的答案,也可以确保没有尾随空格等。

def split_string(a):
    p = a.rpartition('(')
    out1 = p[0].strip()
    out2 = p[2].partition(')')[0]
    return [out1, out2]

results = []
for i in output:
    res = split_string(i)
    results.extend(res)

输出:

['ADLN', 'ADLN.SI', 'CN ACCESS INDEX (TR)', 'SGXCN2.SI', 'CN ACCESS STB (10%) INDEX', 'SGXCN7.SI', 'CN ACCESS STB (5%) INDEX', 'SGXCN6.SI', 'FNGUIDE CN ACC (1X) TR IDX', 'SGXCN15.SI', 'FNGUIDE CN ACC INV 1X TR KRW IDX', 'SGXCN13.SI', 'FNGUIDE CN ACC LEV 2X TR IDX', 'SGXCN14.SI', 'FTSE ST All-Share Index', 'FSTAS.SI', 'FTSE ST Basic Materials Index', 'FSTAS1000.SI', 'FTSE ST Catalist Index', 'FSTICA.SI']