基于分号的单独列表元素

时间:2015-03-05 05:00:16

标签: python list parsing

我有一个以

形式从文件中读取的列表
 ['48998.tyrone-cluster;gic1_nwgs;mbupi;18:45:44;R;qp32\n', '48999.tyrone-cluster;gic2_nwgs;mbupi;0;Q;batch\n', '49005.tyrone-cluster;...01R-1849-01_2;mcbkss;00:44:23;R;qp32\n', '49032.tyrone-cluster;gaussian_top.sh;chemraja;0;Q;qp32\n', '49047.tyrone-cluster;jet_egrid;asevelt;312:33:0;R;qp128\n', '49052.tyrone-cluster;case3sqTS1e-4;mecvamsi;0;Q;qp32\n', '49053.tyrone-cluster;...01R-1850-01_1;mcbkss;0;Q;batch\n', '49054.tyrone-cluster;...01R-1850-01_2;mcbkss;0;Q;batch\n']

在此列表中,我需要基于以下内容分离元素;并获取列表的输出

输出应该是:

 '48998','18:45:44','R','qp32'
 '48999','0','Q','batch'
 '49005','00:44:23','R','qp32'   (and so on till the end of the list)
 '49054','0','Q','batch'        

应该写入文件。现在我尝试这样的代码,但无法获得所需的输出。

parsed_data = [content[0].split(".")[0], content[3], content[4], content[5].strip()]

3 个答案:

答案 0 :(得分:1)

L = ['48998.tyrone-cluster;gic1_nwgs;mbupi;18:45:44;R;qp32\n', '48999.tyrone-cluster;gic2_nwgs;mbupi;0;Q;batch\n', '49005.tyrone-cluster;...01R-1849-01_2;mcbkss;00:44:23;R;qp32\n', '49032.tyrone-cluster;gaussian_top.sh;chemraja;0;Q;qp32\n', '49047.tyrone-cluster;jet_egrid;asevelt;312:33:0;R;qp128\n', '49052.tyrone-cluster;case3sqTS1e-4;mecvamsi;0;Q;qp32\n', '49053.tyrone-cluster;...01R-1850-01_1;mcbkss;0;Q;batch\n', '49054.tyrone-cluster;...01R-1850-01_2;mcbkss;0;Q;batch\n']

answer = [operator.itemgetter(0,3,4,5)(s.split(';')) for s in L]
answer = [(t[0].split('.')[0], t[1], t[2], t[3].strip()) for t in answer]

输出:

Out[13]: 
[('48998', '18:45:44', 'R', 'qp32'),
 ('48999', '0', 'Q', 'batch'),
 ('49005', '00:44:23', 'R', 'qp32'),
 ('49032', '0', 'Q', 'qp32'),
 ('49047', '312:33:0', 'R', 'qp128'),
 ('49052', '0', 'Q', 'qp32'),
 ('49053', '0', 'Q', 'batch'),
 ('49054', '0', 'Q', 'batch')]

答案 1 :(得分:1)

我喜欢分解函数来进行解析。然后,您可以将该函数与map一起使用,或者在列表推导中使用。

inval = ['48998.tyrone-cluster;gic1_nwgs;mbupi;18:45:44;R;qp32\n', '48999.tyrone-cluster;gic2_nwgs;mbupi;0;Q;batch\n', '49005.tyrone-cluster;...01R-1849-01_2;mcbkss;00:44:23;R;qp32\n', '49032.tyrone-cluster;gaussian_top.sh;chemraja;0;Q;qp32\n', '49047.tyrone-cluster;jet_egrid;asevelt;312:33:0;R;qp128\n', '49052.tyrone-cluster;case3sqTS1e-4;mecvamsi;0;Q;qp32\n', '49053.tyrone-cluster;...01R-1850-01_1;mcbkss;0;Q;batch\n', '49054.tyrone-cluster;...01R-1850-01_2;mcbkss;0;Q;batch\n']

def parse(raw):
    parts = raw.strip().split(';')
    _id, _ = parts[0].split('.')
    return _id, parts[3], parts[4], parts[5]

print map(parse, inval)

# or 
# print [parse(val) for val in inval]

<强>输出

[('48998', '18:45:44', 'R', 'qp32'),
 ('48999', '0', 'Q', 'batch'),
 ('49005', '00:44:23', 'R', 'qp32'),
 ('49032', '0', 'Q', 'qp32'),
 ('49047', '312:33:0', 'R', 'qp128'),
 ('49052', '0', 'Q', 'qp32'),
 ('49053', '0', 'Q', 'batch'),
 ('49054', '0', 'Q', 'batch')]

我个人赞成在这种类型的解析中使用可读性。嵌套列表推导或更高级的技术是完全可以接受的,但简单,易于遵循的代码在我的书中具有极大的价值。

答案 2 :(得分:0)

list_of_lists = [item.split(';') for item in original_list]
list_of_tuples_final = [(li[0].split('.')[0], li[3], li[4], li[5].strip()) for li in list_of_lists]

输出是一个元组列表,类似于:

[('48998', '18:45:44', 'R', 'qp32'), ... , ('49054', '0', 'Q', 'batch')]