2

这是一个场景,我正在检查 B 中是否存在 A 的元素。虽然这段代码有效,但当我阅读数百万行时需要花费大量时间。有效的方法是将 A 和 B 中的每个列表作为字典并查看它们是否存在于彼此中。但是我想不出一种简单的方法来进行字典查找。那是对于dict A中的每个键值对,我想检查该键值对是否存在于dictB中

A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]]]

B=  [['A',[1,2,3]],['E',[6,7]],['F',[8,9]]]

count = 0

for line in A:

  if len(line[1]) > 1:

     if line in B:

       count = count + 1

print count
4

4 回答 4

5
  1. 将列表转换为元组
  2. 将元组列表转换为集合
  3. 相交两组
  4. 打印交点的长度

例子:

A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]]] 
B = [['A',[1,2,3]],['E',[6,7]],['F',[8,9]]]

A_set = set((a, tuple(b)) for a, b in A)
B_set = set((a, tuple(b)) for a, b in B)
print len(A_set & B_set)
于 2013-01-30T23:36:59.780 回答
2

您总是可以尝试使用列表理解并以此为基础逐步提高:

a = [[1], [5], [7]]
b = [[5], [7], [0]]
r = [x for x in a if x in b]
于 2013-01-30T23:44:32.093 回答
1

制作A字典B

dA = dict(A)
dB = dict(B)

然后,只需检查键和值是否匹配:

count = 0
for k,v in dA.iteritems():
    if dB.get(k) == v:
        count += 1
于 2013-01-30T23:37:33.750 回答
0

您需要对 B 进行一些预处理,因此它的元素是不可变的。

def deep_tuple(x):
    if type(x) in [type(()), type([])]:
        return tuple(map(deep_tuple,x))
    return x


A = ['A',[1,2,3]],['D',[3,4]],['E',[6,7]]
B = ['A',[1,2,3]],['E',[6,7]],['F',[8,9]]]
B = set(deep_tuple(B))
count = 0
for line in A:
  if len(line[1]) > 1:
     if line in B: 
       count = count + 1
print count

把 B 变成一个集合。与 O(|B|) 相比,在集合中查找是 O(1)。此操作的整体复杂性将与 O(|A|) 成正比。

于 2013-01-30T23:33:06.733 回答