如果我想根据文档的行元素生成元组列表,我可以这样做:
[(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])或解包或两者一起使用,这将与理解列表语法兼容。
可行吗?
答案 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')
,或者在需要时将其包装到列表中。