我有一个巨大的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)
我不认为标准词典支持重复,不确定用于支持重复键,值对的数据结构
答案 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