Python:综合列表中的别名

时间:2016-02-13 15:45:28

标签: python list-comprehension

我正在制作一个脚本,用于提取cvs文件中的信息。 每列由";"分隔。 输出应该是包含我想要提取的列的字符串列表。

我想用全面的列表来做这件事,我想做点什么:

[ c[1] for c as l.split(";") in for l in lines ]

如果你了解Python,你会发现它不起作用。 我怎么能实现这样的目标?

当然我可以使用[ l.split(";") for l in lines ]但实际上我需要提取几个列,这样做多次拆分并不是正确的选择。

文件看起来像:

115239747;darwin;simone;simone@gmail.com;678954312
112658043;de beauvoir;charles;charles@laposte.net;745832259
115831259;ramanujan;godfrey;godfrey@etu.univ.fr;666443810
114873956;hardy;srinivasa;srini@hotmail.com;659332891
114823401;germain;marguerite;marg@etu.univ.fr;768532870
115821145;yourcenar;sophie;sophie@gmail.com;645388521
114560013;harendt;michel;micha@etu.univ.fr;666458200
115702831;foucault;hannah;ha@laposte.net;691337456

我想提取第二和第三列。

编辑:我不想只使用Python语言功能(没有cvs库),因为它是关于Python的初学者课程。谢谢。

5 个答案:

答案 0 :(得分:4)

由于更新的问题更新了答案:

>>> import csv
>>> from operator import itemgetter
>>> 
>>> cols = [1,2] # list all the columns you want here
>>> with open('testfile') as f:
...     ig = itemgetter(*cols)
...     result = [ig(row) for row in csv.reader(f, delimiter=';')]
... 
>>> result
[('darwin', 'simone'), ('de beauvoir', 'charles'), ('ramanujan', 'godfrey'), ('hardy', 'srinivasa'), ('germain', 'marguerite'), ('yourcenar', 'sophie'), ('harendt', 'michel'), ('foucault', 'hannah')]

没有进口:

>>> cols = [1,2] # list all the columns you want here
>>> with open('testfile') as f:
...     split_lines = [line.split(';') for line in f]
...     result = [[line[col] for col in cols] for line in split_lines]
... 
>>> result
[['darwin', 'simone'], ['de beauvoir', 'charles'], ['ramanujan', 'godfrey'], ['hardy', 'srinivasa'], ['germain', 'marguerite'], ['yourcenar', 'sophie'], ['harendt', 'michel'], ['foucault', 'hannah']]

答案 1 :(得分:1)

由于这是您需要阅读的CSV文件,为什么不使用csv module

import csv

with open('file.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=";")
    for row in reader:
        print(row)

答案 2 :(得分:0)

[l.split(";")[1] for l in lines ]

答案 3 :(得分:0)

喜欢这个吗?

text = "1;2;3\n4;5;6\n;7;8;9"

col = 1 # for column 1

L = [row.split(";")[col] for row in [line for line in text.split('\n')]]

print(L)
['2', '5', '7']

答案 4 :(得分:0)

如果您想从拆分数据中进行子选择,可以采用两种方法:

您可以将slice syntax用于简单案例。

[l.split(";")[1:3] for l in lines]  # will retrieve data from [1,3) range - effectively 1 and 2

对于更复杂的案例,operator.itergetter是一种方法。

  

返回一个可调用对象,该对象使用。从其操作数中获取项   操作数的__getitem__()方法。如果指定了多个项目,   返回一个查找值元组。例如:

import operator
[operator.itemgetter(1,2)(l.split(";")) for l in lines]  # you explicitly pick data with indices 1, 2