Python - 在for循环中使用一个frozenset列表的问题

5

我正在尝试学习一本使用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)

当我将原始可迭代对象中的每个元素映射到一个frozenset时,我注意到内部循环("for candidate in Ck2")仅执行一次。之后它不再执行。上面的代码没有映射frozenset时,内部循环正常执行10次。然而,当映射frozenset时,我只能让内部循环执行一次。
请帮我解决这个问题。书中将可迭代值映射到frozenset,因为他们不希望它对算法产生影响。我只是试图按原样进行操作。
我在Anaconda(Spyder)上使用Python 3.5.1。
由于我对Python和机器学习都很新,请帮忙。
谢谢和问候, Mahesh。
2个回答

5

在Python 3中,map操作符不会返回可重复迭代的列表,而是返回一次性可迭代的迭代器。类似于Python 2.x中的itertools.imap

要解决这个问题,可以使用

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

请参见Python 3.x中如何使map()函数返回列表以获取更多信息和其他解决方案。


0
在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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接