【问题标题】:Python - issue with using a list of frozenset entries in a for loopPython - 在for循环中使用frozenset条目列表的问题
【发布时间】:2016-02-11 10:04:23
【问题描述】:

我正在尝试从一本使用 Python 的书中学习先验机器学习算法,作为学习的一部分,我目前遇到以下问题:

以下代码结构似乎可以正常工作:

Ck = [[1], [2], [3], [4], [5]]
    for tranid in range(10): 
        for candidate in Ck:
            print("Printing candidate value: ", candidate)

但是,以下方法不起作用:

Ck = [[1], [2], [3], [4], [5]]
Ck2 = map(frozenset, Ck)
    for tranid in range(10): 
        for candidate in Ck2:
            print("Printing candidate value: ", candidate)

当我将原始迭代的每个元素映射到一个frozenset 时,我注意到内部循环(“for Candidate in Ck2”)只执行一次。之后它永远不会执行。上面没有 freezeset 的代码正确地循环了内部循环 10 次。但是,使用 freezeset 映射后,我可以让内部循环只执行一次。

请帮我解决这个问题。这本书已经将可迭代的值映射到frozenset,因为他们不希望它对于算法的目的是可变的。我只是想照原样遵循它。

我在 Anaconda (Spyder) 上使用 Python 3.5.1。

请帮忙,因为我是 Python 和机器学习的新手。

感谢和问候, 马赫什。

【问题讨论】:

    标签: python python-3.x set frozenset


    【解决方案1】:

    map 操作符在 python3 中不返回列表 您可以重复迭代,但可以使用一次性迭代器。 在 python3.x 中,map 的作用类似于 python2.x 中的itertools.imap

    要解决问题,请使用

     Ck2=list(map(frozenset, Ck)))
    

    有关更多信息和其他解决方案,请参阅Getting a map() to return a list in Python 3.x

    【讨论】:

      【解决方案2】:

      在 python2.x 中,map 函数返回一个列表。在 python3.x 中map 函数返回一个映射对象,一个可迭代对象。确实,一个迭代器。当您运行内部 for 循环一次时,迭代器将结束,因此您无法再从中获取值。在 python 2.x 中,您可以多次从列表中获取值。

      你应该修改为:

      Ck = [[1], [2], [3], [4], [5]]
      for tranid in range(10): 
          Ck2 = map(frozenset, Ck)
          for candidate in Ck2:
              print("Printing candidate value: ", candidate)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-26
        • 2011-07-21
        • 2017-07-26
        • 2017-11-06
        相关资源
        最近更新 更多