2011-06-28 14 views
-1

リストの2つの異なるリスト(AとBと呼ぶ)があり、AとviceversaではなくBにある要素を見つけなければならない。 2つのメインリスト内のリストは順不同で、基本的に文字列を含んでいます。私はこの問題を解決するためのコードやヒントを探しています。リストのリスト内の特定のリストを見つける

編集:私はコードを投稿しませんでした。なぜなら、それは非常にばかだからです。しかし、要求、私が試しコードとして:

for elem in list0: 
    if not (elem in list1): 
     for d in list1: 
      if not (d in list0): 
       /*stuff I got to do on the elements*/ 

EDIT2:テストケース:

A = [[a, b, c], [d, e, f]] 
B = [[b, a, c], [a, o, p]] 

Iは[[、O = FUNCT(A、B)をEXECおよび戻り値Cとして取得します、p]]。私はまた、逆行者D = [d、e、f]が必要です。

+0

あなたは、テストケースを与えることができますか? – tkerwin

+1

あなたが試したコード、および/または扱うデータの例を投稿してください。 –

+0

ユニークなサブリストが必要ですか? – thegrinner

答えて

0

は、あなたがこのようなものを使用することができますあなたのリストとサブリストのすべてがハッシュ可能な場合は、setのメンバーシップテストと違いは一般にO(1)です。

a,b,c,d,e,f,o,p = 'a','b','c','d','e','f','o','p' # make these hashable things 

A = [[a, b, c], [d, e, f]] 
B = [[b, a, c], [a, o, p]] 

def is_iterable(obj): 
    try: 
     iter(obj) 
    except TypeError: 
     return False 
    else: 
     return not isinstance(obj, basestring) # consider strings atomic 

def flatten(seq): 
    for item in seq: 
     if is_iterable(item): 
      for subitem in flatten(item): 
       yield subitem 
     else: 
      yield item 

print list(set(flatten(A)) - set(flatten(B))) 
print list(set(flatten(B)) - set(flatten(A))) 

出力:

['e', 'd', 'f'] 
['p', 'o'] 
+0

私は私を削除しました。しかし、はい、パラメータをタプルに変換する必要があります。 – YXD

1

あなたの二つのリストは、L1とL2ある場合:何が必要に応じて、

set(l1).symmetric_difference(set(l2)) 

または

set(l1) - set(l2) 

[list(x) for x in set([frozenset(x) for x in l1])^set([frozenset(x) for x in l2])] 

注:これはオリジナルの要素を返しませんリスト内の要素はハッシュ可能であればリストは以下を使用し、その後...ハッシュ可能されていないため、動作しません

リストを並べ替える。

diff = lambda a,b: [x for x in a if x not in b] 

mergelist = lambda lVals: reduce(lambda res,x: res + x, map(tuple, lVals)) 

diff(mergelist(A), mergelist(B)) 
diff(mergelist(B), mergelist(A)) 

コメントあたりとして編集:EDITED

mergelist = lambda lVals: reduce(lambda res,x: res + x, map(tuple, lVals)) 
diff = set(a)^set(b) # would contains difference between two initial lists 

A = [['a', 'b','c'], ['d','e', 'f']] 
B = [['b', 'a', 'c'], ['a', 'o', 'p']] 

diff = lambda a,b: [list(x) for x in map(tuple, map(sorted, a)) if x not in map(tuple, map(sorted, b))] 
print diff(A, B) 
print diff(B, A) 
+0

最初に設定する必要があります(l1)^ set(l2);) – Ant

+0

XOR、right ... :) –

+1

OPの質問にネストされたリストはハッシュ可能ではないため、 。 – martineau

1

あなたが入力したデータ文字列のリストのリストである場合

関連する問題