2

これがシナリオです。A の要素が B に存在するかどうかを確認しています。このコードは機能しますが、何百万行も読むと時間がかかります。効率的な方法は、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. 2 つのセットを交差させる
  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 に答える