Python3で重複がないリストを作れた話(setを使って)

先日「重複のないリスト作れた〜やった〜」って記事を書いたけど、Dive into Python3を読んでたら、setを使う方が圧倒的に簡単だったので、このあいだと同じものをsetを使って書いてみた。

 

標準入力から受け取るデータは前回と同じ。

 

 

apple banana orange strawberry orange banana banana grape

 

 

このあいだのを書き直すと次のようになる。

 

 

data = input().rstrip().split()

# 重複なしの集合を生成
no_deplicate = set(data)

for i in no_deplicate:
    print(i + " " + str(data.count(i)))

 

 

実行結果は以下のとおり。

 

 

strawberry 1
apple 1
orange 2
grape 1
banana 3

 

 

前はつらつらと7行書いてたのが、4行になった。簡単・便利。

ただ気をつけたいのは、集合はリストの時に持っていた順番を無視するので、以前のものと実行結果は異なっている。paizaやAIZU Online Judgeでは元のリストの順番を守った上で出力しないといけないこともあるので、その際にはこの方法は使えない。

集合については以下のサイトが簡単でわかりやすく書いていた。

ネイティブデータ型 - Dive Into Python 3 日本語版

Python3でpaiza online hackathon 7を解いた話

ゲーム感覚でやると楽しい、とても楽しい。途中まで解いて、「あれ…あとからコード見直せないの…」ってなって、また書き直すのはつらかったけど。

 

 

つり目

 

num = int(input().rstrip())

print("Ann" * num)

 

眼帯

 

all_book = [i for i in range(1,int(input().rstrip())+1)]
num1 = int(input().rstrip())
my_book = [int(i) for i in input().rstrip().split()]
num2 = int(input().rstrip())
store_book = [int(i) for i in input().rstrip().split()]

buy_book =

for i in all_book:
    if i not in my_book and i in store_book:
        buy_book.append(str(i))

if len(buy_book) == 0:
    print("None")
else:
    print(" ".join(buy_book))

 

猫耳

 

print(input().rstrip().count("cat"))

 

 

data = input().rstrip()
count_c = data.count("c")
count_a = data.count("a")
count_t = data.count("t")

print(min(count_c, count_a, count_t))
print(max(count_c, count_a, count_t) - count_c)
print(max(count_c, count_a, count_t) - count_a)
print(max(count_c, count_a, count_t) - count_t)

 

ショートヘア

 

print(int(input().rstrip()) + int(input().rstrip()))

 

ロングヘア

 

data = [input().rstrip() for _ in range(5)]

if data.count("yes") > data.count("no"):
    print("yes")
else:
    print("no")

 

ポニーテール

 

data = int(input().rstrip())

while data >= 0:
    if data != 0:
        print(data)
    else:
        print(str(data) + "!!")
    data -= 1

 

ツインテール

 

drink1 = [int(i) for i in input().rstrip().split()]
drink2 = [int(i) for i in input().rstrip().split()]

if drink1[0] / drink1[1] > drink2[0] / drink2[1]:
    print(1)
else:
    print(2)

 

セーラー服

 

data = int(input().rstrip())

words = [input().rstrip() for _ in range(data)]

print("_".join(words))

 

カーディガン

 

total = 1

for i in range(1, int(input().rstrip()) + 1):
    total *= i

print(total)

 

縞ニーソックス

 

 

len_one = int(input().rstrip())
len_all = int(input().rstrip())

repeat = len_all // len_one
rest = len_all % len_one

for i in range(1, repeat + 1):
    if i % 2 == 1:
        print("R" * len_one, end = "")
    else:
        print("W" * len_one, end = "")

if repeat % 2 == 1:
    print("W" * rest, end = "")
else:
    print("R" * rest, end = "")

 

メイド服

 

work = int(input().rstrip())

day = 24 * 60
hour = 60
min_sleep = 6 * hour
wakeup = 7 * hour

for _ in range(work):
    overwork = int(input().rstrip())
    require_sleep = min_sleep + overwork / 3

    if require_sleep <= wakeup:
        sleep_hour = (wakeup - require_sleep) // 60
        sleep_min = wakeup - require_sleep - 60 * sleep_hour
    elif require_sleep > wakeup:
        sleep_hour = (day + wakeup - require_sleep) // 60
        sleep_min = day + wakeup - require_sleep - 60 * sleep_hour

    print("{:02d}{}{:02d}".format(int(sleep_hour), ":", int(sleep_min)))

 

サンタ服

 

X, Y, Z, N = map(int, input().rstrip().split())

forward = [0, X]
side = [0, Y]

for i in range(N):
    data = list(map(int, input().rstrip().split()))
    if data[0] == 0:
        forward.append(data[1])
    else:
        side.append(data[1])

forward.sort()
side.sort()

forward_margin =
side_margin = []

def margin(originallist, resultlist):
    for i in range(1, len(originallist)):
        resultlist.append(originallist[i] - originallist[i-1])

margin(forward, forward_margin)
margin(side, side_margin)

print(min(forward_margin) * min(side_margin) * Z)

 

水着

 

ん〜わからん。正解のコードは以下のサイトにあった。

 

めがね

 

ん〜これもわからん。正解のコードは以下のサイト。

 

メイド服はpaizaランクCの問題なんやけど、全然わからなくて苦労した。datetime使うんかなぁとか4時間以上悩んでた気がする。でも解けたときは「やった〜」っていう達成感があった。

サンタ服はすんなりこうしたらええんかなぁってのが浮かんだ。

めがねの問題はわかりそうで、わからなかった。まだ勉強が足りひんのやろうなぁ。悔しい…。

水着の問題はPOH7 安藤杏ちゃんに水着をPythonでプレゼントした話 - Qiitaにあった最終的なコードを自分も思いついて提出したけど、なぜかwrong answerになってしまう。で、さっきの方が書かれたコードをコピペして提出しても通らないし、お手上げ状態。

初心者の自分のコードよりもっと効率的でわかりやすい書き方もあると思うから、もっと勉強して、いずれ見直して書き直したい。

Python3で重複がないリストを作れた話

AIZU Online Judgeとかpaizaとかやってると重複のないリストを作れとか、重複があるとしてどれだけ重複してるか数えろって問題に出くわす。

う〜ん、どうやるんかなぁ、わからへんなぁって放置してたんだけど、なんかパッとひらめいて書いてみたら、へたっぴな自分にしては上手に書けたので残しとこうと思う。

まず標準入力から受け取るデータは空白で区切られた文字列。

 

 

apple banana orange strawberry orange banana banana grape

 

 

これから要素の重複がないリストを作成し、また要素が元のデータでどれだけ重複していたかをカウントする。

 

 

data = input().rstrip().split()

# 重複なしのリスト生成
no_deplicate = []

# 元のリストからデータを一つずつ取り出す
for i in data:
    # もしno_deplicateに同じデータがなければ、要素を追加する
    if i not in no_deplicate:
        no_deplicate.append(i)

for i in no_deplicate:
    print(i + " " + str(data.count(i)))

 

 

実行結果は以下のとおり。

 

 

apple 1
banana 3
orange 2
strawberry 1
grape 1

 

 

ぐぐったらset使う方が多分メジャーなやり方なんかな?でも自分としてはなんかこっちがしっくりきたし、ひらめいて嬉しかった。

Python3の標準出力で数字を空白で区切って出力したかった話

また休日にpaizaスキルチェックを受けている。

今回は数字を空白で区切って出力しろって問題を解いてた。

標準出力はprint()使うのはいいとして、どうやって区切るんやろ…endオプションでつなげるんかな…

 

print(i , end = " ")

 

これでいけるやんと思って提出前の動作確認したら、wrong answerって言われた…そうか…これやと最後にも半角の空白が入るからあかんやなと思って、こう書いてみた。

 

for i in range(x, y) #x,yは任意の数字
    if 条件式: #最後以外はこっち

        print(i , end = " ")
    else: #最後だけ
        print(i)

 

う、うんこみたいなコードが出来てしまった…。これはさすがにまずいでぇと思ったけど、スキルチェックって時間が決まってて、早く出さんとあかんから、とりあえずこれで提出した。

さすがにこんな書き方はまずいと思ったから調べてみたら、なんかリストに1回結果を入れて、それを半角空白でつなぐ方法があるらしい。多分こう書けばよかったんやろな。

 

list1 = [str(i) for i in range(x,y)] #x,yは任意の数字
print(" ".join(i))

 

さっきよりはきれいになった。よかったぁ、ちょっと嬉しい。1行目でstr()ってしてるのは、半角空白でつなげるには文字列じゃないとあかんから。

Python3の標準入力で空白区切の数字を受け取りたかった話

休日というのに外にも出ずに引きこもっています。朝は7時前に目が覚めて、映画を観て、洗濯をして、お昼ごはんを作って、さぁ昼から何しようかなってとこで昔に触ったことのあるpaizaラーニングとpaizaスキルチェックをやってみたくなった。

スキルチェックっていうのは競技プログラミングみたいに、標準入力からデータを受け取って、それに指定した処理をして出力してくださいっていう問題を解くもの。僕としてはおもしろいなぁと思っている。

数年ぶりのスキルチェックだから、どうやればいいかなって感じで進めてたんだけど…標準入力で空白で区切られた数字の受け取り方がわからない…。

 

0 4 10 43 56

 

みたいな数字をリストに数字として受け取りたいんだけど、その方法がわからなくて頭を悩ませてた。ひねり出した汚いコードがこれ。

 

list1 = map(int, input().split())
list1 = list(list1)

 

1行目でmapオブジェクト作って、2行目でリストにしてる。汚いなぁ、酷いなぁと思いながらも、これを使って提出したら通ったからいいんだけど、なんか気持ち悪くて調べてみたらリスト内包表記が簡潔に書けて便利らしい。

リスト内包表記…なんか難しそうやん…って思ってたら、めっちゃわかりやすいページがあった。

今まであんまり理解できてなかったのが、めっちゃわかりやすく書いてた。で、これを使うとさっきの処理が1つに次のようにまとまる。

 

list1 = [int(i) for i in input().split()]

 

こっちのほうが断然美しいし、断然わかりやすい。input().split()で一旦文字列のリストを作って、それにint()を適用してるのを繰り返してるって感じ。

躓きながらも、これからも学習を続けていきたい。

Beautiful Soup 4について覚えておきたい自分メモ

Beautiful Soup4のドキュメントを読みながら勉強中。読み終わったら、seleniumのものを読みたい。

読んで「ほぉ〜なるほどなぁ」ってなったことも、いずれ忘れてしまうので、「なるほどなぁ…これ忘れたらなにやってるかわからんようになるな」っていう自分だけのポイントを残しておきたいと思う。

  • find_all() の name 引数に値を渡すと、タグの名前だけを対象に検索する。 テキスト文字列は無視。name 引数は文字列, 正規表現, リスト, 関数, True値をとることができる。
  • find_all(id=True)とすると、id属性に値が入っている全てのHTMLタグを見つける。このとき、値は何でも良い。
  • ”class”はPython予約語のため、class をキーワード引数として用いると文法エラー。  class_ というキーワード引数でCSSのクラスを検索する。

他も長々と書いてあったけど、そういう細かいのはまた追い追い必要になった時に調べるようにしよう。

 

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation

 

正規表現に感動した話

BeautifulSoupというpython用のライブラリのドキュメントを読みながら勉強してた。その時に「正規表現」って言葉が出てきて、以前の記憶を探っていると「あっこれ…前に調べたけど…なんかようわからんやつやな」って思い出が蘇ってきた。

まぁでもわからんままにしておくのも気持ち悪いので、ググっていくつかサイトをみたけど、やっぱりようわからん。「サルでもわかる」とかいうサイトも見たんやけど、わからへんかったので、「そうか…サル未満やったんか…つらい…」「ようわからんなぁ…またわからんままか…ん〜」って嘆いてたら、めっちゃわかりやすいサイトがあった。

これを半信半疑で読んで、手を動かしてみたら「な、なんや!なんやこれ!めっちゃ便利やん!」と感動してスルスルと理解が深まった。

電話番号の検索っていう馴染みやすいものをテーマにし、また自分で動かすことで視覚的にも理解ができるようになっていたため、今までつまづいていた僕でも理解することができた。

今までpythonの本を読んでも「ん?暗号?日本語でオーケー」って感じやったんやけどね。

久しぶりに学んでて「オォ!そういうことやったんか!」ってなって嬉しかったから、ブログに残しておきたくなった。

それにしてもあんなものをはじめに考え出した人はすごいなぁ。