代码之家  ›  专栏  ›  技术社区  ›  PowerApp101

这能转换成列表吗?

  •  0
  • PowerApp101  · 技术社区  · 7 年前

    下面的函数返回URL处文本文件中的单词列表:

    def fetch_words():
        with urlopen('http://sixty-north.com/c/t.txt') as story:
            story_words = []
            for line in story:
                line_words = line.decode('utf-8').split()
                for word in line_words:
                    story_words.append(word)
        return story_words
    

    我很想看看这是否可以转化为一个等效的列表理解。我试过:

    with urlopen('http://sixty-north.com/c/t.txt') as story:
         return [word for word in line.decode('utf-8').split() 
                 for line in story]
    

    但它的错误是“未解决的参考‘线’”。看来我误解了嵌套列表理解的工作原理,有人能解释一下吗?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Ned Batchelder    7 年前

    当列表理解有两个循环时,它们的顺序必须与语句相同:

    with urlopen('http://sixty-north.com/c/t.txt') as story:
        return [
            word 
            for line in story
            for word in line.decode('utf-8').split() 
        ]
    
        2
  •  2
  •   Selcuk    7 年前

    您的语法有点错误,请尝试以下方法:

    return [word for line in story for word in line.decode('utf-8').split()]
    
        3
  •  2
  •   cs95 abhishek58g    7 年前

    为了简单起见,我建议使用 requests 模块:

    story_words = [
        word 
        for line in requests.get('http://sixty-north.com/c/t.txt').iter_lines() 
        for word in line.decode('utf-8').split()
    ]
    

    不需要上下文管理器。


    如果你读取的数据相当小,你可以使用

    story_words = [
        word 
        for line in requests.get('http://sixty-north.com/c/t.txt').text.splitlines()
        for word in line.split()
    ]