【问题标题】:Writing python two-level loop comprehension编写python两级循环理解
【发布时间】:2016-01-25 16:30:25
【问题描述】:

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

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)}

【问题讨论】:

标签: python list-comprehension dictionary-comprehension


【解决方案1】:

使用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') 'assignment'。

【讨论】:

    【解决方案2】:

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

    首先,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)}
    

    【讨论】:

    • 谢谢!我对此非常好奇。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    相关资源
    最近更新 更多