3

Pythonに組み込まれているリスト減算/リスト差分関数はありますか?私はそのような関数の書き方を知っているので、それを説明する必要はありません。でも、よくあることなので、そのような機能がすでに組み込まれているかどうか知りたいです。

ソートされたリストが2つあり、それぞれに同じ要素の複数のコピーが含まれている可能性があります。

発生回数を考慮して、リストの違いを知りたい(セットの違いでは不十分)

例えば:

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]

diff (l1, l2) 
[1,3,5,6]

diff (l2,l1)
[8,9]
4

4 に答える 4

8

たぶん、 Counterクラスを使用することができます。


例:

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]
from collections import Counter

print Counter(l1) - Counter(l2)
print Counter(l2) - Counter(l1)

結果:

Counter({1:1、3:1、5:1、6:1})
Counter({8:1、9:1})


編集:

オブジェクトからリストを取得するにはCounter、次のコードを使用できます。

from itertools import chain
r = Counter(l2) - Counter(l1)
list(chain(*[p*[k] for k,p in r.items()]))

辞書のようなリストからリストを作成し、これをCounter使用list(chain(* ... ))して単一のリストにフラット化します。

于 2012-08-02T09:39:28.667 に答える
2

BigYellowCactusからの解決策は完璧だと思います。Counterリストに拡張する方法を追加したかっただけです。

>>> from itertools import chain
>>> from collections import Counter
>>> a=[1,1,1,1,1,2,3,4,2,2]
>>> b=[1,1,1,2,3]
>>> list(chain(*[[k]*v for (k,v) in (Counter(a)-Counter(b)).items()]))
[1, 1, 2, 2, 4]
于 2012-08-02T09:52:12.210 に答える
1

セットを使用

l1 = [1,1,2,3,5,6]
l2 = [1,2,8,9]

def  diff (list1, list2) :
    return list(set(list1).difference(set(list2)))

print diff(l1,l2)

>>> 
[3, 5, 6]
于 2012-08-02T09:43:05.953 に答える
-1

私は現在これを使用しています:

def listdiff (l1, l2):
    for x in l1:
        if x in l2:
            l1.remove(x)
            l2.remove(x)
    return l1
于 2012-08-02T09:41:33.127 に答える