在列表理解中解开拆分



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

[(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或erthing(,并且可以与索引(splittedList [0](或两者一起使用(,这将与理解列表语法兼容。

是可行的吗?

您可以在开放中使用 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"))]  

您可以将map与Unbound方法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'),或在需要时将其包装到列表中。

最新更新