Python 默认字典给出重复键

Python default dictionary giving duplicate key

当我在 python 的默认字典中传递数据时,我得到一个输出:

defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1']})                          
defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1']})
defaultdict(<type 'list'>, {'[6, 19, 32, 45]': ['1']})
defaultdict(<type 'list'>, {'[3, 16, 29, 42]': ['1']})

如何在上面的输出中得到重复的键?

不应该像

defaultdict(<type 'list'>, {'[0, 13, 26, 39]': ['1', '1']})                          
defaultdict(<type 'list'>, {'[6, 19, 32, 45]': ['1']})
defaultdict(<type 'list'>, {'[3, 16, 29, 42]': ['1']})

我运行的密码是

def make_bands(value):
    d2 = defaultdict(list)
    for key, val in value.iteritems():
        d2[(str(list(val[0:4])))].append("1")

    print d2

value是另一个字典

调用函数make_bands处理Spark RDD如下:

signatureBands = signatureTable.map(lambda x: make_bands(x)).collect()

首先,不,你不能期望输出是你想要的。 d2 不会在调用之间保留。每次您进入该功能时都会重新创建它。如果你使用 class 来保持状态,你仍然可以获得你想要的东西,一个生成器(这在这里不太优雅),或者一个构造函数而不是 lambda 的函数(这是我在这里的选择):

def build_make_bands():
    d2 = defaultdict(list)
    def make_bands(value):
        for key, val in value.iteritems():
            d2[(str(list(val[0:4])))].append("1")
        print d2
    return make_bands

然后你会这样称呼它:

 signatureTable.map(build_make_bands()).collect()