Python - 在for循环中使用冻结集条目列表的问题

时间:2016-02-11 10:04:23

标签: python python-3.x set frozenset

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

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

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)

当我将原始可迭代的每个元素映射到冻结集时,我注意到内循环("对于Ck2中的候选者" )仅执行一次。之后它永远不会执行。上面没有冻结集的代码正确地循环内循环10次。但是,使用frozenset映射,我可以让内循环只执行一次。

请帮我解决这个问题。本书已将可迭代值映射到frozenset,因为他们不希望它为算法的目的而变得可变。我只是想按原样跟随它。

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

请帮忙,因为我不熟悉Python和机器学习。

谢谢和问候, 马赫什。

2 个答案:

答案 0 :(得分:5)

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以获取更多信息和其他解决方案。

答案 1 :(得分:0)

在python2.x中,map函数返回一个列表。在python3.x map函数中返回一个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)