编写python两级循环理解

时间:2016-01-25 16:30:25

标签: python list-comprehension dictionary-comprehension

我有一个包含以下行的输入文件:

key \t  value1  \t value2 ..... 

我想将此文件读入字典,其中key是该行的第一个标记,值是值列表。

我觉得这样的事情可以做到,但是python给了我一个错误,名字l没有被定义。我如何写一个具有两个级别" for"的理解?像这样的陈述?

f = open("input.txt")
datamap = {tokens[0]:tokens[1:] for tokens in l.split("\t") for l in enumerate(f)}

2 个答案:

答案 0 :(得分:6)

使用csv模块并将每一行插入字典:

import csv

with open('input.txt') as tsvfile:
    reader = csv.reader(tsvfile, delimiter='\t')
    datamap = {row[0]: row[1:] for row in reader}

这完全避开了这个问题。

可以str.split()结果放入元组中以创建'循环变量':

datamap = {row[0]: row[1:] for l in f for row in (l.strip().split("\t"),)}

此处row绑定到元组的str.split()个结果,有效地创建了row = l.strip().split('\t')'赋值'。

答案 1 :(得分:2)

Martijn's让您了解改进流程,但只是为了直接解决您在代码中遇到的问题:

首先,enumerate并没有按照您的想法行事(尽管我并不完全确定您认为它在做什么)。你可以摆脱它。

其次,Python正试图解决这个问题:

tokens[0]:tokens[1:] for tokens in l.split("\t")
在之前

,它会看到您将l定义为的内容。您可以在第二个理解周围加上括号,使其按照您的意图进行评估:

datamap = {tokens[0]:tokens[1:] for tokens in (l.split("\t") for l in f)}