【问题标题】:Explanation needed for map method returning generator [duplicate]map方法返回生成器需要解释[重复]
【发布时间】:2018-08-01 09:25:52
【问题描述】:

我的脚本正在进行中:

def plotRegression(data):
    '''read labdata.txt and plot
    x,y coordinates using formula'''

    import turtle

    wn = turtle.Screen()
    t = turtle.Turtle()
    t.speed()

    #set up variables
    x_list = [i[0] for i in data]
    y_list = [i[1] for i in data]

    #formula goes here

    #set window size here

with open("labdata.txt") as f:
    #coords = [map(int, line.split()) for line in f]
    coords = list(map(int, line.split()) for line in f)

plotRegression(coords)

labdata.txt 示例:

44 71
79 37
78 24

运行脚本时出错:

Traceback (most recent call last):
  File "plot_regression.py", line 23, in <module>
    plotRegression(coords)
  File "plot_regression.py", line 12, in plotRegression
    x_list = [i[0] for i in data]
  File "plot_regression.py", line 12, in <listcomp>
    x_list = [i[0] for i in data]
TypeError: 'map' object is not subscriptable

我的这个问题的目标是从 labdata.txt 中读取数据,并将数据准备好作为整数供函数读取。我认为此时我的事情过于复杂了,但我有一些东西要学习,因此感谢您的帮助!

在 with 语句中,我注释掉了一行。我第一次在别人的代码中看到了这个 map 方法,我想试一试,因为它看起来很有用。但是,经过一些错误和研究后,看起来这是 Python 2 代码,而我使用的是 Python 3,因此存在一些差异,无法正确运行代码。

在 stackoverflow 上的搜索解释了 map 函数“返回一个生成器”,但我不确定这意味着什么。有人可以向我解释为什么我的尝试不起作用吗?

【问题讨论】:

  • 它没有。它返回一个迭代器。如果您需要列表,请致电list
  • @juanpa.arrivillaga 我在上面的代码中有“coords = list(map(int, line.split()) for line in f)”,但我仍然遇到错误。我在知识的某个地方存在差距,我正在努力解决这个问题。我试过通读文档,但有很多我不明白的地方。抱歉,因为我大约一个月前才开始学习编程,一切都是那么新!
  • 如果你只是在学习,那么我会避免生成器表达式/列表理解并将其与map 混合,但无论如何list(map(int, line.split()) for line in f) 应该真正使用列表理解:[map(int, line.split() for line in f],你可以使用 [list(map(int, line.split())) for line in f] 或使用嵌套列表理解:[[int(x) for x in line.split()] for line in f] 但现在,坚持使用 for 循环。
  • @juanpa.arrivillaga 看来我已经潜得太深了,无法理解。我现在会坚持使用 for 循环。谢谢!

标签: python


【解决方案1】:
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.

>>> map(int, '1 2 3 4'.split())
<map object at 0x7f9202ae9518>
>>> m = map(int, '1 2 3 4'.split())
>>> m[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'map' object is not subscriptable

>>> list(map(int, '1 2 3 4'.split()))
[1, 2, 3, 4]
>>> list(map(int, line.split()) for line in '1 2\n3 4'.split('\n'))
[<map object at 0x7f9202ae9780>, <map object at 0x7f9202ae9828>]
>>> list(list(map(int, line.split())) for line in '1 2\n3 4'.split('\n'))
[[1, 2], [3, 4]]
>>> [[int(num) for num in line.split()] for line in '1 2\n3 4'.split('\n')]
[[1, 2], [3, 4]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-20
    • 2012-11-08
    • 2016-05-25
    • 1970-01-01
    相关资源
    最近更新 更多