简体   繁体   中英

Writing python two-level loop comprehension

I have an input file that contains lines of:

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

I'd like read this file into a dictionary where key is the first token of the line and the value is the list of the values.

I think something like this would do it, but python gives me an error that name l is not defined. How do I write a comprehension that has two levels of "for" statements like this?

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

Use the csv module and insert each row into a dictionary:

import csv

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

This sidesteps the issue altogether.

You can put a str.split() result into a tuple to create a 'loop variable':

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

Here row is bound to the one str.split() result from the tuple, effectively creating a row = l.strip().split('\\t') 'assignment'.

Martijn's got you covered for improving the process, but just to directly address the issues you were seeing with your code:

First, enumerate is not doing what you think it's doing (although I'm not entirely sure what you think it's doing). You can just get rid of it.

Second, Python is trying to resolve this:

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

before it sees what you're defining l as. You can put parentheses around the second comprehension to make it evaluate as you intended:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM