Python set型 使い方 スクリプトの書き方

バイオインフォ道場、くまぞうです。

Pythonで重複を排除したデータを管理する場合は、set型を使うと便利です。Python2.3以前では、setsモジュールをimportして使います。

スポンサーリンク



Python set型

Pythonのsetは、リストのような表現を使います。データの追加・削除が可能です。ただし、重複したデータが新たに追加されることはありません。また、「&」や「|」を使って、集合演算を行うことが出来ます。しかし、順番という概念はないので、インデックスを指定してデータを取り出したり、スライスで範囲指定を行うことは出来ません。他のプログラミング言語でも同様なデータ構造が準備されているものもあります。

Python set型の使い方

基本的な操作

Python2.3以前では、最初にsetsモジュールをimportしておきます。

import sets

set型の定義

Pythonのset型はset関数で作ります。Python3.0では、波括弧{}で囲んで表現できます。

  >>> aaa = set([1, 2, 3])
  set([1, 2, 3])
  >>> bbb = set(['aaa', 'bbb', 'ccc'])
  set(['aaa', 'bbb', 'ccc'])

データの追加

set型のデータ追加は、add関数を使います。

  >>> aaa = set([1, 2, 3])
  set([1, 2, 3])
  >>> aaa.add(4)
  >>> aaa
  set([1, 2, 3, 4])

  >>> aaa.add(4)  # 同じものを追加しても変化なし(重複なし)
  set([1, 2, 3, 4])

  >>> aaa = set([1, 2, 3])
  >>> aaa |= set([1, 4]) # 「|」(和集合演算)を使って追加
  >>> aaa
  set([1, 2, 3, 4])

データの削除

set型のデータの削除は、remove関数を使います。ただし、要素として存在しないものを削除しようとするとエラーになります。エラーを生じさせないように処理したい場合は、discard関数を使うと良いです。

  >>> aaa = set([1, 2, 3])
  >>> aaa
  set([1, 2, 3])
  >>> aaa.remove(1)
  >>> aaa
  set([2, 3])

  >>> aaa.discard(2)
  set([3])
  >>> aaa.discard(2)
  set([3])

便利な操作

Python2.3以前では、最初にsetsモジュールをimportしておきます。

import sets

和集合

和集合の演算は「|」かunion関数を使います。

  >>> aaa = set([1, 2, 3])
  >>> bbb = set([1, 4])
  >>> aaa | bbb
  set([1, 2, 3, 4])
  >>> aaa.union(bbb)
  set([1, 2, 3, 4])

共通集合

共通集合の演算は「&」かintersection関数を使います。

  >>> aaa = set([1, 2, 3])
  >>> bbb = set([1, 4])
  >>> aaa & bbb
  set([1])
  >>> aaa.intersection(bbb)
  set([1])

差集合

差集合の演算は「-」かdifference関数を使います。

  >>> aaa = set([1, 2, 3])
  >>> bbb = set([1, 4])
  >>> aaa - bbb
  set([2, 3])
  >>> aaa.difference(bbb)
  set([2, 3])

サンプル

setを使った、Pythonのスクリプト例です。2つのgeneリストファイルを読みこんでデータをset型で管理します。最後に共通集合を求めます。

sets_test.py

#! /usr/local/bin/python
# -*- coding: utf-8 -*-

import sets

dic = {"list1":set([]), "list2":set([])}

for file in ["list1", "list2"]:
    f = open(file)
    for line in f.readlines():
        gene = line.strip() 
        dic[file].add(gene) # ファイル毎のset型にadd
        print gene
    print

f.close()

print dic["list1"]
print dic["list2"]
print dic["list1"] & dic["list2"] # 共通集合

list1

gene1
gene2
gene3
gene1
gene2

list1

gene3
gene1
gene4
gene5
gene1

実行と結果

  $ ls
  list1
  list2
  sets_test.py

  $ python sets_test.py 
  gene1
  gene2
  gene3
  gene1
  gene2

  gene3
  gene1
  gene4
  gene5
  gene1

  set(['gene1', 'gene2', 'gene3'])
  set(['gene1', 'gene3', 'gene4', 'gene5'])
  set(['gene1', 'gene3'])
スポンサーリンク