编写 python 二级循环理解

Writing python two-level loop comprehension

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

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

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

我认为像这样的东西可以做到,但是 python 给我一个错误,名称 l 未定义。我如何编写具有两个级别的 "for" 语句的理解?

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

使用 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()结果放入元组中以创建'loop variable':

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

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

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

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

其次,Python 正在尝试解决此问题:

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

before 它会看到您将 l 定义为什么。您可以在第二个推导式两边加上括号,使其按您的预期进行计算:

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