在列表理解中拆分拆分

时间:2017-04-27 11:46:32

标签: python list split

如果我想根据文档的行元素生成元组列表,我可以这样做:

[(line.split()[0], line.split()[-1][3:8]) for line in open("doc.txt")]  
例如

(我添加了切片以表明我可能希望对拆分元素使用一些操作)。

我仍然希望避免使用拆分两次,因为这样做效率不高 所以我想使用

来解压缩
[(linesplit0, linesplit1[3:8]) for line in open("doc.txt") for (linesplit0, linesplit1) in line.split()]  

但由于分割中没有元组,因此无法工作,因此在分割的每个元素中我们都缺少一个元素。

我想要的是允许使用占位符名称作为拆分结果的列表(如splittedlist或其他),并且可以与索引(splittedlist [0])或解包或两者一起使用,这将与理解列表语法兼容。

可行吗?

2 个答案:

答案 0 :(得分:2)

您可以在打开时使用map(python3)或itertools.imap(python2):

[(line[0], line[-1][3:8]) for line in map(str.split, open("doc.txt"))]

或使用发电机:

[(line[0], line[-1][3:8]) for line in ( l.split() for l in open("doc.txt"))]  

答案 1 :(得分:2)

您可以将map与未绑定的方法str.split

一起使用
[(linesplit[0], linesplit[-1][3:8]) for linesplit in map(str.split, open("doc.txt"))]

然而,我会远离这些;我改为使用发电机:

def read_input(filename):
    with open(filename) as f:
        for line in f:
            parts = line.split()
            yield parts[0], parts[-1][3:8]

它可能会更多,但它更易于遵循 - 并且可读性很重要 - 用户可以选择使用read_input('doc.txt'),或者在需要时将其包装到列表中。