stkblog

白血病と関係ないことを書きます なにかあったら教えて下さい

言語処理100本ノックやった #00-04

趣旨

python を勉強したいので

言語処理100本ノック 2015

“言語処理100本ノックは,実践的な課題に取り組みながら,プログラミング,データ分析,研究のスキルを楽しく習得することを目指した問題集です”

2015/10/28 22:20

を粛々と解いていこうと思う。ネット上にさらしておくことでそのうちすごい人がもっと賢いやり方を教えてくれることに期待

python 歴

昔読んだ本

入門 自然言語処理

入門 自然言語処理

  • 作者: Steven Bird,Ewan Klein,Edward Loper,萩原正人,中山敬広,水野貴明
  • 出版社/メーカー: オライリージャパン
  • 発売日: 2010/11/11
  • メディア: 大型本
  • 購入: 20人 クリック: 639回
  • この商品を含むブログ (44件) を見る

の最初の方だけ昔やったと思う

最近は Coursera

最近 CourseraLearn to Program and Analyze Data with Python を見てる。コーセラのシステム最初ちょっとわかりにくかったんだけど certificate が不要なら無料。いま3コース目をはじめたとこ

これの内容をカバーしてるらしい

あとプログラミングコンテストみたいなやつ

過去問を解いたりしてみてるけど、
yukicoder なら☆2つ、
AtCoder (アットコーダー) なら ABC(初心者向け)のB問題くらいしか解けない(要するに初心者)


他はRとLaTeXを昔ちょっと

バージョンは Python 2.7.10 (default, Jul 14 2015, 19:46:27) らしいです

本題

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

#00 文字列の逆順

文字列の逆順を得る。[::-1]でおk

str = 'stressed'
ans = str[::-1]
print ans #desserts

#01「パタトクカシーー」

文字列の1,3,5,7文字目を取り出して連結。

str = u'パタトクカシーー'
nums = [0,2,4,6]
ans = ''
for n in nums:
    ans += str[n]
print ans #パトカー

空の文字列にほしい文字だけ足してく

しかし幅が一定なのでこれでよかったことに気付いた

str = u'パタトクカシーー'
ans = str[::2]
print ans #パトカー

#02 「パトカー」+「タクシー」=「パタトクカシーー」

「パトカー」+「タクシー」の文字を先頭から交互に連結

str1 = u'パトカー'
str2 = u'タクシー'
ans = ''
for i in xrange(4):
    ans += str1[i] + str2[i]
print ans #パタトクカシーー

これも空の文字列にほしい文字だけ足してく

#03 円周率

各単語の(アルファベットの)文字数を先頭から出現順に並べたリストを作成

str = "Now I need a drink, alcoholic of course, after the heavy lectures involving quantum mechanics."
str = ''.join([s for s in str if s not in [',', '.']])
list = [len(i) for i in list(str.split(' '))]
print list #[3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5, 8, 9, 7, 9]

最初2行目書かなかったら , と . も数えてしまって円周率の数字にならなかったので

#04 元素記号

1, 5, 6, 7, 8, 9, 15, 16, 19番目の単語は先頭の1文字,それ以外の単語は先頭に2文字を取り出し,〜

str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
atom = dict()
cnt = 0
for item in str.split():
    if cnt in [0, 4, 5, 6, 7, 8, 14, 15, 18]:
        atom[item[0]] = cnt+1
    else:
        atom[item[:2]] = cnt+1
    cnt += 1
print atom
print 'マグネシウムが Mi になるけどいいっすか'
# {'Be': 4, 'C': 6, 'B': 5, 'Ca': 20, 'F': 9, 'S': 16, 'H': 1, 'K': 19, 'Al': 13, 'Mi': 12, 'Ne': 10, 'O': 8, 'Li': 3, 'P': 15, 'Si': 14, 'Ar': 18, 'Na': 11, 'N': 7, 'Cl': 17, 'He': 2}

空のディクショナリを作って、カウンターで場合分けして key は1文字か2文字、value はカウンター+1。

cnt += 1 を if 節の前に置いたほうが見た目よかった

str = "Hi He Lied Because Boron Could Not Oxidize Fluorine. New Nations Might Also Sign Peace Security Clause. Arthur King Can."
atom = dict()
cnt = 0
for item in str.split():
    cnt += 1
    if cnt in [1, 5, 6, 7, 8, 9, 15, 16, 19]:
        atom[item[0]] = cnt
    else:
        atom[item[:2]] = cnt
print atom
#{'Be': 4, 'C': 6, 'B': 5, 'Ca': 20, 'F': 9, 'S': 16, 'H': 1, 'K': 19, 'Al': 13, 'Mi': 12, 'Ne': 10, 'O': 8, 'Li': 3, 'P': 15, 'Si': 14, 'Ar': 18, 'Na': 11, 'N': 7, 'Cl': 17, 'He': 2}


とりあえずこんな感じで


変数の名前 'str' にしたせいで自動色付けおかしくなっててすいません