Python Language
セット
サーチ…
構文
- empty_set = set()#空のセットを初期化する
- literal_set = {'foo'、 'bar'、 'baz'}#内部に3つの文字列を含むセットを構築する
- set_from_list = set(['foo'、 'bar'、 'baz'])#新しいセットに対してset関数を呼び出す
- set_from_iter = set(範囲(30)のxはx)#任意のiterablesを使用して集合を作成する
- set_from_iter = {xは範囲(10)のiに対して[random.randint(0,10)]のxに対して}}#代替表記
備考
セットは順不同であり、 非常に高速なルックアップ時間を持っています(テクニカルを取得する場合は、償却O(1))。あなたが物事のコレクションを持っているときに、順序は関係ありません、あなたは多くの名前で項目を探しているでしょう使用することは素晴らしいです。インデックス番号で項目を参照する方が合理的な場合は、代わりにリストを使用することを検討してください。注文が重要な場合は、リストも考慮してください。
セットは変更可能であり、したがってハッシュすることはできません。したがって、それらをディクショナリ・キーとして使用することも、他のセットに入れることも、ハッシュ可能タイプを必要とするその他の場所に置くこともできません。そのような場合、不変のfrozenset
使用することができます。
セットの要素はハッシュ可能でなければなりません。これは、正しい__hash__
メソッドを持っていることを意味します。これは__hash__
と一貫してい__eq__
。一般に、 list
やset
などの可変型はハッシュ可能ではなく、セットに入れることはできません。この問題が発生した場合は、 dict
と不変キーの使用を検討してください。
リストの一意の要素を取得する
あなたがレストランのリストを持っているとしましょう - 多分あなたはファイルからそれを読んでいます。あなたはリスト内のユニークなレストランを気にします。一意の要素をリストから取得する最も良い方法は、それをセットに変換することです。
restaurants = ["McDonald's", "Burger King", "McDonald's", "Chicken Chicken"]
unique_restaurants = set(restaurants)
print(unique_restaurants)
# prints {'Chicken Chicken', "McDonald's", 'Burger King'}
セットは元のリストと同じ順序ではないことに注意してください。セットが順序付けられていないので、それは同じように、あるdict
秒。
これはPythonの組み込みlist
関数を使ってList
に簡単に戻すことができます。これは、元のリストと同じリストですが重複はありません:
list(unique_restaurants)
# ['Chicken Chicken', "McDonald's", 'Burger King']
これを1行にするのも一般的です。
# Removes all duplicates and returns another list
list(set(restaurants))
これで、元のリストで実行できる操作はすべて再実行できます。
セットに対する操作
他のセットと
# Intersection
{1, 2, 3, 4, 5}.intersection({3, 4, 5, 6}) # {3, 4, 5}
{1, 2, 3, 4, 5} & {3, 4, 5, 6} # {3, 4, 5}
# Union
{1, 2, 3, 4, 5}.union({3, 4, 5, 6}) # {1, 2, 3, 4, 5, 6}
{1, 2, 3, 4, 5} | {3, 4, 5, 6} # {1, 2, 3, 4, 5, 6}
# Difference
{1, 2, 3, 4}.difference({2, 3, 5}) # {1, 4}
{1, 2, 3, 4} - {2, 3, 5} # {1, 4}
# Symmetric difference with
{1, 2, 3, 4}.symmetric_difference({2, 3, 5}) # {1, 4, 5}
{1, 2, 3, 4} ^ {2, 3, 5} # {1, 4, 5}
# Superset check
{1, 2}.issuperset({1, 2, 3}) # False
{1, 2} >= {1, 2, 3} # False
# Subset check
{1, 2}.issubset({1, 2, 3}) # True
{1, 2} <= {1, 2, 3} # True
# Disjoint check
{1, 2}.isdisjoint({3, 4}) # True
{1, 2}.isdisjoint({1, 4}) # False
単一要素で
# Existence check
2 in {1,2,3} # True
4 in {1,2,3} # False
4 not in {1,2,3} # True
# Add and Remove
s = {1,2,3}
s.add(4) # s == {1,2,3,4}
s.discard(3) # s == {1,2,4}
s.discard(5) # s == {1,2,4}
s.remove(2) # s == {1,4}
s.remove(2) # KeyError!
セット操作では新しいセットが返されますが、対応するインプレースバージョンがあります。
方法 | インプレース操作 | インプレース方式 |
---|---|---|
連合 | s | = t | 更新 |
交差点 | s&= t | intersection_update |
差 | s - = t | difference_update |
symmetric_difference | s ^ = t | symmetric_difference_update |
例えば:
s = {1, 2}
s.update({3, 4}) # s == {1, 2, 3, 4}
セットとマルチセット
集合は異なる要素の順不同の集合です。しかし、時には、必ずしも明確ではなく、要素の多重度を把握している要素の順序付けられていない集合を扱うことが必要です。
この例を考えてみましょう。
>>> setA = {'a','b','b','c'}
>>> setA
set(['a', 'c', 'b'])
文字列'a'
、 'b'
、 'b'
、 'c'
をセットデータ構造体に保存することにより、 'b'
が2回発生するという情報を失ってしまった。もちろん、要素をリストに保存すると、この情報が保持されます
>>> listA = ['a','b','b','c']
>>> listA
['a', 'b', 'b', 'c']
リストのデータ構造は余分な不要な順序付けを導入し、計算が遅くなります。
マルチセットを実装するために、Pythonは、 collections
モジュールからCounter
クラスを提供します(バージョン2.7以降)。
>>> from collections import Counter
>>> counterA = Counter(['a','b','b','c'])
>>> counterA
Counter({'b': 2, 'a': 1, 'c': 1})
Counter
は、要素が辞書キーとして格納され、そのカウントが辞書値として格納される辞書です。そして、すべての辞書として、それは並べ替えられていないコレクションです。
メソッドと組み込み関数を使用して操作を設定する
2組のa
とb
を定義する
>>> a = {1, 2, 2, 3, 4}
>>> b = {3, 3, 4, 4, 5}
注:
{1}
は1つの要素のセットを作成しますが、{}
は空のdict
作成します。空のセットを作成する正しい方法はset()
です。
交差点
a.intersection(b)
、両方の中に存在する元素で新しいセットを返しa
とb
>>> a.intersection(b)
{3, 4}
連合
a.union(b)
のいずれかに存在する元素で新しいセットを返しa
とb
>>> a.union(b)
{1, 2, 3, 4, 5}
差
a.difference(b)
は、要素がb
にa
がb
は存在しない新しい集合を返す
>>> a.difference(b)
{1, 2}
>>> b.difference(a)
{5}
対称差
a.symmetric_difference(b)
は、 a
またはb
いずれかに存在するが両方には存在しない要素を持つ新しいセットを返します
>>> a.symmetric_difference(b)
{1, 2, 5}
>>> b.symmetric_difference(a)
{1, 2, 5}
注記 : a.symmetric_difference(b) == b.symmetric_difference(a)
サブセットとスーパーセット
c.issubset(a)
は、 c
各要素がc
かどうかをテストa
ます。
a.issuperset(c)
は、 c
各要素がc
かどうかをテストa
ます。
>>> c = {1, 2}
>>> c.issubset(a)
True
>>> a.issuperset(c)
True
後者の演算には、以下に示すように同等の演算子があります。
方法 | オペレーター |
---|---|
a.intersection(b) | a & b |
a.union(b) | | b |
a.difference(b) | a - b |
a.symmetric_difference(b) | a ^ b |
a.issubset(b) | a <= b |
a.issuperset(b) | a >= b |
不規則な集合
集合a
とd
は、 a
の要素がd
もなく、その逆の場合も互いに素である。
>>> d = {5, 6}
>>> a.isdisjoint(b) # {2, 3, 4} are in both sets
False
>>> a.isdisjoint(d)
True
# This is an equivalent check, but less efficient
>>> len(a & d) == 0
True
# This is even less efficient
>>> a & d == set()
True
メンバーシップのテスト
組み込みin
occurancesためのキーワード検索
>>> 1 in a
True
>>> 6 in a
False
長さ
組み込みのlen()
関数は、セット内の要素の数を返します
>>> len(a)
4
>>> len(b)
3
セットのセット
{{1,2}, {3,4}}
につながる:
TypeError: unhashable type: 'set'
代わりに、 frozenset
使用してください:
{frozenset({1, 2}), frozenset({3, 4})}