redis-py体験レポート No.6 -集合

Redisの集合(Sets)は、Pythonの集合とほぼ同じようなものです(たぶん)。

実験準備

いつもと同じく、Python対話モードでRedisサーバーに接続します。

>>> import redis
>>> conn = redis.Redis()
>>> conn.flushall() # まっさらの状態にする。

集合の作成と要素の取得

新たに集合を作成するには、sadd関数を使う。

>>> conn.sadd('lang', 'Python', 'Ruby', 'JavaScript')
3
>>> conn.sadd('lang', 'C++') # 既存の集合にsaddするとメンバーの追加になる。

集合のメンバーを取得するには、smembers関数を使う。

>>> conn.smembers('lang')
{b'JavaScript', b'Ruby', b'Python', b'C++'}

集合の要素数の取得

scard関数を使う。

>>> conn.scard('lang')
4

この要素は集合に含まれるのか?

ある要素が集合に含まれるかどうかを調べるには、sismember関数を使う。

>>> conn.sismember('lang', 'Python')
True
>>> conn.sismember('lang', 'C#')
False

共通集合 A∩Bの取得

sinter関数を使う。

>>> conn.sadd('even', 2, 4, 6, 8, 10, 12) # 偶数の集合
6
>>> conn.sadd('3baisu', 3, 6, 9, 12, 15) # 3の倍数の集合
5
>>> conn.sadd('4baisu', 4, 8, 12, 16, 20) # 4の倍数の集合
5
>>> conn.sinter('even', '3baisu') # 偶数かつ3の倍数の集合
{b'6', b'12'}
>>>  conn.sinter('even', '3baisu', '4baisu') # 偶数かつ3の倍数かつ4の倍数
{b'12'} 集合が3個以上でも大丈夫。

和集合 A∪Bの取得

sunion/sunionstore関数を使う。

>>> conn.flushall() # まっさらの状態にする。
>>> conn.sadd('lang1', 'C', 'R', 'D')
3
>>> conn.sadd('lang2', 'Python', 'R', 'Ruby')
3
>>> conn.sadd('lang3', 'C', 'C++', 'C#')
3
>>> conn.sunion('lang1', 'lang2', 'lang3')
{b'C++', b'Python', b'C', b'C#', b'R', b'Ruby', b'D'}
>>> 
>>> conn.sunionstore('new_lang', 'lang1', 'lang2', 'lang3') #第1引数に第2引数以降の和集合がセットされる。
7
>>> conn.smembers('new_lang')
{b'C++', b'Python', b'C', b'C#', b'R', b'Ruby', b'D'}

集合から任意の要素を取得する

spop/srandmember関数を使う。

実験するにあたって、トランプのカードを表す集合を作るPythonスクリプトを書きます。

card.py

# トランプのカードを表す集合を作る。
import redis

conn = redis.Redis()
conn.delete('card')
for s in ['S', 'H', 'D', 'C']:
    for i in range(1, 14):
        conn.sadd('card', "{}{}".format(s, i))

こいつを実行すると、cardという集合に52個の要素が作られます。

$ python card.py

Python対話モードで実験開始。

>>> conn.scard('card') # カードの枚数を調べる。
52
>>> conn.spop('card') # カードを1枚引く。
b'S5' ランダムに引かれるので、何が表示されるかは実行されるまでわかりません。
conn.scard('card') # カードが1枚減ります。
51
>>> conn.srandmember('card') # srandmemberでカードを引くと・・・
b'S13'
>>> conn.scard('card') # カードは減りません。
51

お疲れ様でした。

Redisプログラミング物語 © 2016 Frontier Theme