2017-04-27 72 views
1

如果我要生成基于文档的行元素的元组的列表,我可以这样做:拆包列表理解内部分裂

[(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])一起使用,或者解包或两者) ,并且这将与理解列表语法兼容。

是否可行?

+1

'[(拉姆达话:(字[0],词语[-1] [3:8]))(line.split()),例如,开放线( “doc.txt”)]' –

+1

使用一个嵌套发生器表达式:'[(LS [0],LS [-1] [3:8]),用于(line.split LS(),例如,开放( 'doc.txt' 线)。'把发电机表达在一个单独的行中,如果需要为了可读性而在一个变量中。 –

+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"))] 
+0

谢谢,这也很好,我有一个生成器的另一个答案,但你的使用,而不是另一种语法。不是嵌套因为嵌套是 [A“对于b在c代表在b] 尽管你的是[A”为在(b”为C b)](裸露的中间处理这可能是你想要的任何和在字母旁边标有(“'”) 那么y怎么会你称这种语法? “级联”?有一个特定的名称来区分它与嵌套? –

+1

有两种不同的嵌套。这个嵌套在另一个不同的发电机内。没有括号,你有一个单一的生成器,但使用嵌套理解迭代器(理解的'for'部分)。 – chepner

+1

生成器语法返回一个对象生成器,所以'(x for x in whatever)'返回一个生成器对象然后它在列表理解中使用@AndoJurai – Netwave

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')因为如此,或包成一个之间的选择列表如果需要。

+0

聪明。通过“像这样使用它”,你是否意味着例如作为迭代器?发电机本身的其他用例是什么? –