使用python在大型JSON数据集中查找值和重复项

时间:2014-11-11 17:19:11

标签: python json data-structures

我有一个巨大的JSON对象数据集(B)。我还有另一个较小的JSON对象数据集(A)。查看A中的每个元素是否在B范围内的最快方法是什么?另外,我如何检查A中是否有重复的B元素?

我想到的是创建数据集B的dictionary,其键值对是相同的JSON值。这将允许快速查找。我将对集合A执行相同的操作,但集合A中每个键的值将是一个空列表。

对于集合A中的每个键,将在集合B上查找并附加到相应的列表中。完成此操作后,列表的长度将决定是否找不到,匹配,重复这些值中的任何一个。

如果集合A中键的列表长度为

0  --> none found in B
1  --> 1 found in B
>1 --> more than one found in B (duplicates found)

我不认为标准词典支持重复,不确定用于支持重复键,值对的数据结构

1 个答案:

答案 0 :(得分:2)

嗯,这是最好的猜测。它使用dicts而不是json对象,因此您需要仔细检查比较是否适用于您的情况。这使用生成器来生成(object,count)元组。如果B中有{0}个obj个实例,则插入False。然后,它检查False是否存在,以满足:

  

查看A中的每个元素是否都在B

之内

我不知道这是否是最快的方式,但它是我想到的最重要的方式。 A和B是dicts的列表,在这种情况下,只是{'a':'a'}对用于测试。在最后玩切片,看看它是否符合您的要求。

列表A包含所有其他字母,列表B包含来自D-Z的字母。

import string

a = [{x:x} for x in list(string.ascii_lowercase)[0:26:2]] # Every other letter                                                                               
b = [{x:x} for x in list(string.ascii_lowercase)[3:26]]

def compare(a, b):
    for obj in a:
        c = b.count(obj)
        if c == 0:
            yield False # Every element in A is not in B                                                                                                     
        yield (obj, c)


findings = [res for res in compare(a,b)]
print findings

if False in findings:
    print "Every element of A is not in B"
else:
    for res in findings:
        obj, num = res
        print "Object %s was found %d times" % (str(obj), num)

如果您不需要计数,可以将比较功能更改为:

def compare2(a, b):
    for obj in a:
        if b.count(obj) == 0:
            return False
    return True