【问题标题】:Joining a varying number of list elements加入不同数量的列表元素
【发布时间】:2017-11-27 22:50:47
【问题描述】:

我有以下字符串列表:

data = ['1 General Electric (GE)   24581660 $18.19 0.04 0.22 ',
        '2 Qudian ADR (QD)   24227349 12.22 -3.93 -24.33 ',
        '3 Square Cl A (SQ)   16233308 48.86 0.05 0.10 ',
        '4 Teva Pharmaceutical Industries ADR (TEVA)   15830425 13.70 0.22 1.63 ',
        '5 Vale ADR (VALE)   14768221 10.98 0.21 1.95 ',
        '6 Bank of America (BAC)   13938799 26.59 -0.07 -0.26 ',
        '7 Entercom Communications Cl A (ETM)   13087209 12.00 0.10 0.84 ',
        '8 Chesapeake Energy (CHK)   12948648 3.92 -0.05 -1.26 ',
        "9 Macy's (M)   12684478 21.07 0.44 2.13 "]

其中每个字符串的格式是:count、stock name、volume、一些其他 int 值...

我需要将这些字符串拆分为一个列表,其中每个元素都是上述字符串格式中的一项,这就是我尝试这样做的方式:

for i in range(1, len(data)-1):
    split = data[i].split()
    temp = "{} {} {}".format(split[1], split[2], split[3])
    del split[2 : 4]
    split[1] = temp
    print(split)

但是,我认为这是低效的,并且当名称多于或少于两个单词时它不起作用。我将如何处理?我是否必须首先调整生成字符串(数据)列表的方式?

编辑:

final_data = [
    re.split('(?<=\))\s+|(?<=[\d\$-])\s(?=[\d\$-])|(?<=\d)\s(?=[a-zA-Z])', i)
        for i in data[1]]
final_data = [i[:-1]+[i[-1][:-1]] for i in final_data]
print(final_data)

输出:

~/workspace $ python extract.py 2017-11-27-04-26-51-ss.xhtml
[[''],
 [''],
 [''],

 ...,

 [''],
 [''],
 ['']]

【问题讨论】:

    标签: python regex list split


    【解决方案1】:

    你可以使用re.split:

    import re
    data = ['1 General Electric (GE)   24581660 $18.19 0.04 0.22 ', '2 Qudian ADR (QD)   24227349 12.22 -3.93 -24.33 ', '3 Square Cl A (SQ)   16233308 48.86 0.05 0.10 ', '4 Teva Pharmaceutical Industries ADR (TEVA)   15830425 13.70 0.22 1.63 ', '5 Vale ADR (VALE)   14768221 10.98 0.21 1.95 ', '6 Bank of America (BAC)   13938799 26.59 -0.07 -0.26 ', '7 Entercom Communications Cl A (ETM)   13087209 12.00 0.10 0.84 ', '8 Chesapeake Energy (CHK)   12948648 3.92 -0.05 -1.26 ', "9 Macy's (M)   12684478 21.07 0.44 2.13 "]
    final_data = [re.split('(?<=[a-zA-Z])\s+(?=\()|(?<=\))\s+|(?<=[\d\$-])\s+(?=[\d\$-])|(?<=\d)\s+(?=[a-zA-Z])', i) for i in data]
    

    输出:

    [['1', 'General Electric', '(GE)', '24581660', '$18.19', '0.04', '0.22 '], ['2', 'Qudian ADR', '(QD)', '24227349', '12.22', '-3.93', '-24.33 '], ['3', 'Square Cl A', '(SQ)', '16233308', '48.86', '0.05', '0.10 '], ['4', 'Teva Pharmaceutical Industries ADR', '(TEVA)', '15830425', '13.70', '0.22', '1.63 '], ['5', 'Vale ADR', '(VALE)', '14768221', '10.98', '0.21', '1.95 '], ['6', 'Bank of America', '(BAC)', '13938799', '26.59', '-0.07', '-0.26 '], ['7', 'Entercom Communications Cl A', '(ETM)', '13087209', '12.00', '0.10', '0.84 '], ['8', 'Chesapeake Energy', '(CHK)', '12948648', '3.92', '-0.05', '-1.26 '], ['9', "Macy's", '(M)', '12684478', '21.07', '0.44', '2.13 ']]
    

    去掉括号:

    final_data = [[b[1:-1] if b.startswith('(') and b.endswith(')') else b for b in i] for i in final_data]
    

    输出:

    [['1', 'General Electric', 'GE', '24581660', '$18.19', '0.04', '0.22 '], ['2', 'Qudian ADR', 'QD', '24227349', '12.22', '-3.93', '-24.33 '], ['3', 'Square Cl A', 'SQ', '16233308', '48.86', '0.05', '0.10 '], ['4', 'Teva Pharmaceutical Industries ADR', 'TEVA', '15830425', '13.70', '0.22', '1.63 '], ['5', 'Vale ADR', 'VALE', '14768221', '10.98', '0.21', '1.95 '], ['6', 'Bank of America', 'BAC', '13938799', '26.59', '-0.07', '-0.26 '], ['7', 'Entercom Communications Cl A', 'ETM', '13087209', '12.00', '0.10', '0.84 '], ['8', 'Chesapeake Energy', 'CHK', '12948648', '3.92', '-0.05', '-1.26 '], ['9', "Macy's", 'M', '12684478', '21.07', '0.44', '2.13 ']]
    

    【讨论】:

    • 正则表达式从来都不是我的强项,但我需要计数(第一个数字),作为 final_data 中的自己的字符串。我必须添加 [0-9][0-9] 吗?到正则表达式的开头,所以计数 # 不会与股票名称分开?
    • 我错过了什么吗?我更新了我的帖子,尝试对数据中的第一个字符串进行 re.split,它只是创建了一个空列表列表
    • @Muffinman 你能在运行[i[:-1]+[i[-1][:-1]] for i in final_data] 之前发布final_data 的结果吗?早期的结果应该可以阐明这个问题。
    • 甚至陌生人:[['1'], [''], ['G'], ['e'], ['n'], ['e'], ['r '], ['a'], ['l'], [''], ['E'], ['l'], ['e'], ['c'], ['t'], ['r'], ['i'], ['c'], [''], ['('], ['G'], ['E'], [')'], ['' ]、['']、['']、['2']、['4']、['5']、['8']、['1']、['6']、[' 6'], ['0'], [''], ['$'], ['1'], ['8'], ['.'], ['1'], ['9'] , [''], ['0'], ['.'], ['0'], ['4'], [''], ['0'], ['.'], ['2 '], ['2'], [' ']]
    • @Muffinman 你究竟如何格式化data?当我在data 的帖子中运行代码时,它运行良好。就在您对data 运行正则表达式之前,data 是什么样的?
    【解决方案2】:

    您可以按字符拆分列表

    原始数据列表中的所有字符串都有 2 个部分,股票名称和数字值,如果您在字符串中的右括号上拆分,您可以将其拆分为一个包含股票名称字符串的列表和一个包含数字的字符串,数字之间有一个空格的一致间距,然后您可以在空格字符上拆分数字列表。

    https://docs.python.org/3/library/stdtypes.html#str.split

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-23
      • 1970-01-01
      • 2012-12-02
      • 2017-06-26
      相关资源
      最近更新 更多