差集合

How can I get something just like Z = Y – X? THANKS [on hold] – StackOverflow

li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
Y = set((1, 2, 3, 4, 5, 6))

d = {}
for k, v in li:
    d.setdefault(k, set()).add(v)

{k: Y.difference(v) for k, v in d.items()}

{‘a’: {2, 4, 5, 6}, ‘b’: {2, 3, 4, 6}, ‘c’: {1, 2, 4, 5, 6}}

collections.defaultdictを使うともっとシンプル(でかつ実効性が高い)

from collections import defaultdict

li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
Y = set((1, 2, 3, 4, 5, 6))
dd = defaultdict(set)
for k, v in li:
    dd[k].add(v)

{k: Y.difference(v) for k, v in dd.items()}

{‘a’: {2, 4, 5, 6}, ‘b’: {2, 3, 4, 6}, ‘c’: {1, 2, 4, 5, 6}}

そもそも,それぞれの要素について,(1,2,3,4,5,6)からの差集合を求める場合,
デフォルトを(1,2,3,4,5,6)にした方が都合が良さそう.
そして,「s.discard(x)#set(s)に要素xが存在していれば削除」を使えば良い.

li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
dd = defaultdict(lambda: set((1, 2, 3, 4, 5, 6)))
for k, v in li:
    dd[k].discard(v)

dd

defaultdict(,
{‘a’: {2, 4, 5, 6}, ‘b’: {2, 3, 4, 6}, ‘c’: {1, 2, 4, 5, 6}})
 
 
 

%%timeit
li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
Y = set((1, 2, 3, 4, 5, 6))

d = {}
for k, v in li:
    d.setdefault(k, set()).add(v)

res = {k: Y.difference(v) for k, v in d.items()}

6.98 µs ± 201 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
Y = set((1, 2, 3, 4, 5, 6))
dd = defaultdict(set)
for k, v in li:
    dd[k].add(v)

res = {k: Y.difference(v) for k, v in dd.items()}

6.61 µs ± 202 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

%%timeit
li = [('a', 1), ('a', 3), ('b', 1), ('b', 5), ('c', 3)]
dd = defaultdict(lambda: set((1, 2, 3, 4, 5, 6)))
for k, v in li:
    dd[k].discard(v)

4.79 µs ± 147 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

広告
カテゴリー: 未分類 パーマリンク

差集合 への4件のフィードバック

  1. ピンバック: how to compare values inside list in python? | 粉末@それは風のように (日記)

  2. ピンバック: 2つのリストから辞書を作る | 粉末@それは風のように (日記)

  3. ピンバック: 差集合 | 粉末@それは風のように (日記)

  4. ピンバック: リストから重複要素を取り除いて新しいリストを作る最速の方法 | 粉末@それは風のように (日記)

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中