Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Finding the Hamming Distance: Counting Point Mu...
Search
onouyek
January 07, 2022
Programming
0
440
Finding the Hamming Distance: Counting Point Mutations
【第6回】ゼロから始めるゲノム解析(Python編)
onouyek
January 07, 2022
Tweet
Share
More Decks by onouyek
See All by onouyek
Finding Open Reading Frames
onouyek
0
360
Inferring mRNA from Protein: Products and Reductions of Lists
onouyek
0
340
Finding the Longest Shared Subsequence: Finding K-mers, Writing Functions, and Using Binary Search
onouyek
0
260
Find a Motif in DNA: Exploring Sequence Similarity
onouyek
0
320
Creating the Fibonacci Sequence: Writing, Testing, and Benchmarking Algorithms
onouyek
1
460
Transcribing DNA into mRNA: Mutating Strings, Reading and Writing Files
onouyek
0
520
DNA methylation analysis using bisulfite sequencing data
onouyek
0
830
Operations on Genomic Intervals and Genome Arithmetic
onouyek
0
350
Exploratory Data Analysis with Unsupervised Machine Learning
onouyek
0
310
Other Decks in Programming
See All in Programming
LT資料
t3tra
6
960
DevFest Android in Korea 2025 - 개발자 커뮤니티를 통해 얻는 가치
wisemuji
0
160
LLMで複雑な検索条件アセットから脱却する!! 生成的検索インタフェースの設計論
po3rin
4
870
認証・認可の基本を学ぼう前編
kouyuume
0
260
Tinkerbellから学ぶ、Podで DHCPをリッスンする手法
tomokon
0
140
Pythonではじめるオープンデータ分析〜書籍の紹介と書籍で紹介しきれなかった事例の紹介〜
welliving
2
330
Findy AI+の開発、運用におけるMCP活用事例
starfish719
0
1.5k
エディターってAIで操作できるんだぜ
kis9a
0
740
TestingOsaka6_Ozono
o3
0
170
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
pd1xx
1
740
UIデザインに役立つ 2025年の最新CSS / The Latest CSS for UI Design 2025
clockmaker
18
7.6k
TerraformとStrands AgentsでAmazon Bedrock AgentCoreのSSO認証付きエージェントを量産しよう!
neruneruo
4
950
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
1
250
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Leveraging LLMs for student feedback in introductory data science courses - posit::conf(2025)
minecr
0
84
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
0
2.2k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.8k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.6k
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
25
Mobile First: as difficult as doing things right
swwweet
225
10k
Believing is Seeing
oripsolob
0
10
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
86
Exploring anti-patterns in Rails
aemeredith
2
200
Transcript
【第6回】ゼロから始めるゲノム解析 (Python編) Finding the Hamming Distance: Counting Point Mutations @onouyek
本勉強会の概要・目的 書籍名 対象者/目的 Mastering Python for Bioinformatics Python・バイオインフォ知識ほぼゼロの人 を対象に、正しいPythonのコーディング手 法について学ぶ
頻度 毎週〜隔週開催予定 登壇者 募集中!
Rosalindとは • 問題解決を通じてバイオインフォマティク ス、プログラミング、およびアルゴリズムを 学習するためのプラットフォーム • 大学やハッカソン、就職の面接にも 600回 以上の採用実績あり 参考:https://qiita.com/_kimoton/items/d534d0fa9b83dd7dc412
概要
環境構築 - 必要パッケージ群のインストール # 公開されているレポジトリからファイル群を取得 $ git clone https://github.com/kyclark/biofx_python $
cd biofx_python # requirements.txt に記載のパッケージをインストール $ pip3 install -r requirements.txt # pylintの設定ファイルをホームディレクトリに移動 $ cp pylintrc ~/.pylintrc # mypyの設定ファイルをホームディレクトリに移動 $ cp mypy.ini ~/.mypy.ini
本日のお題 http://rosalind.info/problems/hamm/ DNA配列sとtのハミング距離を求めよ
前提知識編
ハミング距離 文字列sからtに変換するのに必要な編集(置換)の数 AAACCCGGGTTT || | CGACGATATGTC AAACCCGGGTTT ||||||||||| AACCCGGGTTTA 例1:sとtで共通のものは12塩基のうち3塩基なのでハミング距離は
9 例2:sとtの配列はほぼ共通( 92%)だが開始位置から比べるのでハミング距離は 4 AAACCCGGGTTT || || || || AACCCGGGTTTA s t s t s t
位置引数の複数指定 位置引数は順番があるのでargparseで指定した順番にして渡す $ ./hamm.py -h usage: hamm.py [-h] str str
Hamming distance positional arguments: str Sequence 1 str Sequence 2 optional arguments: -h, --help show this help message and exit
abs():絶対値を求める >>> seq1, seq2 = 'AC', 'ACGT' >>> len(seq1) -
len(seq2) -2 2つの配列が異なる場合、差をとると負になる場合がある >>> distance = abs(len(seq1) - len(seq2)) 2 abs()で絶対値を求めることができる
min():最小値を求める range()の引数に求めた最小値を渡せばインデックスを使って文字を比較できる >>> seq1, seq2 = 'AC', 'ACGT' >>> min(len(seq1),
len(seq2)) 2 2つの配列を比べる場合、短い方の長さだけ調べれば良い min()で最小値が求められる >>> for i in range(min(len(seq1), len(seq2))): ... print(seq1[i], seq2[i]) ... A A C C
解法編
Solution 1: min() ①seq1とseq2の長さの差の絶対値をdistanceに代入 ②seq1とseq2の短い方の長さでイテレーション ③seq1とseq2の同じ位置の文字を比較して異なればdistanceをインクリメント ① ② ③
Solution 2: zip() min()で短い方の長さを求めなくても、zip()で短い方に合わせて2つの リストからそれぞれの要素を取り出せる >>> list(zip('AC', 'ACGT')) [('A', 'A'),
('C', 'C')]
Solution 3: zip_longest() zip_longest()で長い方に合わせて2つのリストからそれぞれの要素を取り出せる 短い方は要素がなくなるとNoneが返されるのでabs()で初期値を求める必要がなくなる >>> from itertools import zip_longest
>>> list(zip_longest('AC', 'ACGT')) [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]
Solution 4: リスト内包表記 リスト内包表記で1行で書くことができる >>> seq1, seq2 = 'GAGCCTACTAACGGGAT', 'CATCGTAATGACGGCCT'
>>> [1 if c1 != c2 else 0 for c1, c2 in zip_longest(seq1, seq2)] [1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 1, 0] demo
Solution 5: filter() filter()とlambda関数を使って2つの配列の異なる要素のイテレーターが得られる >>> seq1, seq2 = 'AC', 'ACGT'
>>> list(filter(lambda t: t[0] != t[1], zip_longest(seq1, seq2))) [(None, 'G'), (None, 'T')]
Solution 6: map() map()とlambda関数を使って2つの配列の要素を比較したbool値のイテレーターが得られる map(lambda t: t[0] != t[1], zip_longest('AC',
'ACGT'))) map(lambda t: t[0] != t[1], [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]) lambda('A', 'A'): 'A' != 'A' -> False lambda('C', 'C'): 'C' != 'C' -> False lambda(None, 'G'): None != 'G' -> True lambda(None, 'T'): None != 'T' -> True
Solution 7: starmap() starmap()を使うことで、関数にタプルを展開して渡してくれる def not_same(t): return t[0] != t[1]
starmap(not_same, zip_longest('AC', 'ACGT')) starmap(lambda a, b: a != b, [('A', 'A'), ('C', 'C'), (None, 'G'), (None, 'T')]) *('A', 'A') lambda 'A', 'A': 'A' != 'A' -> False demo
operatorモジュール:関数形式の標準演算子 >>> import operator >>> operator.ne('A', 'A') False >>> operator.ne('A',
'T') True >>> 1 + 2 3 >>> operator.add(1, 2) 3 >>> 'AC' + 'GT' 'ACGT' >>> operator.concat('AC', 'GT') 'ACGT'
追加課題 プログラムを拡張して、2つ以上の入力配列を扱えるようにしてください。各配列のペア 間のハミング距離を表示するようにしてください。
本日学んだこと • abs() • min() • zip() • zip_longest() •
filter() • map() • starmap() • operatorモジュール