2012-07-05 10 views
22

私は式を自動的に因数分解できるコードを書こうとしています。たとえば、 という2つのリスト[1,2,3,4]と[2,3,5]がある場合、コードは2つのリスト[2,3]の共通要素を見つけて結合できるはずです残りの要素は新しいリストにまとめられ、[1,4,5]となります。このポストからリスト内で共通しない要素を探す

:私は共通の要素が

set([1,2,3,4]&set([2,3,5]). 

で見つけることができることを確認How to find list intersection? は、各リストから非共通の要素を取得する簡単な方法がある私の例にある[1,4 ]と[5]?

私は先に行くと、forループを行うことができます。

lists = [[1,2,3,4],[2,3,5]] 
conCommon = [] 
common = [2,3] 
for elem in lists: 
    for elem in eachList: 
    if elem not in common: 
     nonCommon += elem 

しかし、これは冗長で非効率です。 Pythonはこれを行うための便利な機能を提供していますか?前もって感謝します!!

+0

次のような別々のリストを取得したい[1,4]、[5]、または単一のもの[1,4,5]? – nye17

答えて

40

は(XOR演算別名)set秒間対称差演算子を使用します。

>>> set([1,2,3])^set([3,4,5]) 
set([1, 2, 4, 5]) 
+0

ああ、ありがとう! Bueは、上記のコードはset([1,2,3])&set([3,4,5])と同じ量の計算時間とメモリスペースを取るのですか?それとも、コードのパフォーマンスに重大な影響はありませんか? – turtlesoup

+0

あなたの目標を達成する最も効率的な方法です。その複雑さは '&'(すなわち、集合の中の要素数の線形)と同じ順番です。 – Amber

12

あなたはこの種の問題に対処するために交差点の概念を使用することができます。

b1 = [1,2,3,4,5,9,11,15] 
b2 = [4,5,6,7,8] 
set(b1).intersection(b2) 
Out[22]: {4, 5} 

このコードを使用することに関するベストなことは、大きなデータの場合にも非常に高速です。このロジックを使用すると、b1に607139、b2に296029の要素があり、結果は2.9秒です。

0

.__xor__属性メソッドを使用できます。

set([1,2,3,4]).__xor__(set([2,3,5])) 

または

a = set([1,2,3,4]) 
b = set([2,3,5]) 
a.__xor__(b) 
関連する問題