Python 默认字典似乎给出了重复的键 - 发生了什么?

问题描述 投票:0回答:1

下面的代码将数据作为 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()
python python-2.7 pyspark defaultdict
1个回答
3
投票

首先,不,你不能期望输出是你想要的。 d2 在调用之间不保留。每次进入该函数时都会重新创建它。如果你使用一个类来保存状态、一个生成器(这在这里不太优雅)或者一个构造函数而不是 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()
© www.soinside.com 2019 - 2024. All rights reserved.