Pythonのお勉強 Part56
レス数が900を超えています。1000を超えると表示できなくなるよ。
>>812
全然わからないけど説得力があるから一票
このスレ勉強になるわ スクリプトは基本的にゲロ遅いから、アルゴリズムの計算量的には非効率でも
現実には実行されるPythonのインストラクション数が少ない方が速いケースが多いよ 尺取り法でどうやるんだろ
俺もforループか内包くらいしかわからん…
配列の順番変わっていいならsetするけど >817
尺取り法での実装はこんな感じだと思うよ。
obj を idx1 で走査して、
dels を idx2 で走査する。
更新結果はobjnew(最初は空)に保持する。
obj[idx1] < dels[idx2] なら、objnew にobj[idx1]を追加し、idx1を一つ増やす
obj[idx1] == dels[idx2] なら、idx1とidx2をそれぞれ一つ増やす
obj[idx1] > dels[idx2] なら、idx2を一つ増やす
これが、obj, dels のどちらかの要素が尽きたら終わり
上の説明とはちょっと違うけど、コードにすると以下のような感じ。
質問者の希望としては、ループを回さず手短に書きたいってことだろうから、期待には沿えてないかな。
CENTINEL = float("inf")
dels.append(CENTINEL)
objnew = []
i = 0
for x in obj:
__while x > dels[i]: i += 1
__if x < dels[i]:
____objnew.append(x) 範囲がないのに尺取り法と呼ぶのか?
マッチングとか突合せとか呼ばれる、COBOLなんかでよく使われる伝統的な方法だよねそれ
O(N+M)ある程度の要素数がないとPythonインタプリタのゲロ遅さがネックになるから実際にはあまり速くないと思う >819
ご指摘ありがとう。
ポインタ2つ使ってリストをO(N+M)で走査する手法を、尺取り法というのだと思ってた。
尺取り法でググったところ、1つのリストの始点と終点にポインタを置いて、範囲に関する数え上げや最小区間などを求める使い方が多いんだね。
蟻本だと、区間の先頭と末尾を交互に進めながら条件を満たす最小の区間を求める手法、と説明されてた。
Pythonだと、とてつもなく遅くなるのは同意。 sqlalchemyってDISTINCTできませんか? >>822
session.query(Tag).distinct(Tag.name)
はダメで
session.query(Tag.name).distinct()
なのかなるほどね 外部コマンドを実行する場合、commands.getoutputとsubprocess.callとどっちがよいの? 自己レス
osやcommandsは古いから非推奨なのか
環境変数を取得するのにos.getenvを使ってるんだけど、他の方法に置き換えた方がよいの? 三項演算子って何だ、まったく知らんぞい!
なんかメリットとか有るのかな pythonの三項演算式ってリスト内包に通ずるものがあるよな。
ある種の一貫性があるような無いような。 三項演算子のネストをしたときに
いつも優先順位が不安になる 1 if A else 2 if B else 3
最初に評価されるのがAかBかってことだな。
Aっぽい気がするし試したら実際そうだったけど不安にはなるな。 switch文はいらんけど、switch式は欲しいな。 1 if A else 2 if B else 3 if C else 4 Python3を始めたんだけど、これ面白いね。
他の人の書いたコードが読みやすいから参考にしやすい、勉強になるーー
他の言語は諦める。 俺はpythonのためにラテン語諦めることにした。 改行しないと読みづらいよ
1 if A else
2 if B else
3 iOSのpythonista3でアプリ作り始めました。
画面の中のボタンを押すと、別のpyuiファイルをload_view()でcallして、
別の画面へ切り替わる、ということはできたんですが、切り替わる、というよりも
別ウィンドウが何個も立ち上がる、という状態になってるだけみたいです。
画面が切り替わる遷移ってどのメソッド使うのでしょうか? スクレイピングを非同期でしたいのですが
for site in sites:
if site.run_next <= now:
run(site)
これの if site.run_next <= now を↓のようにするにはどうしたらいいですか?
asyncio.wait([ task_run(site) for site in sites ])
恥ずかしながらこれでは上手くいってないようです
t = []
for site in sites:
if site.run_next <= now:
t.append(run(site))
tasks = asyncio.wait(t) こんな感じです。
それぞれのメソッドはAとBのpyuiに配置されたボタンに紐付いています。
import ui
def return(sender):
ui.load_view('A').present('sheet')
def goto(sender):
ui.load_view('B').present('sheet')
v = ui.load_view()
v.present('sheet') すいません
for site in sites if site.run_next <= now
これでいけるのですね
あと先程のは配列が空になってるのが上手くいかない原因だったみたいです プログラム実行中にエラー(例外)を生じた時の処理は、
try-except と if文(条件分岐) はどのように使い分けてる? 例外処理はめんどうだからやらないなあ
どこでどんなエラーが発生するか事前にわかったらエスパーだろ ifで変数があることを確認して、その変数を用いた処理をするところを、
いきなりtryで処理して、エラー時のみ例外処理で済ますという方法もあるから、
どちらで処理したほうがいいかということだな。
タイプで絞り込めば、例外処理は意外と簡単だし、
更に細かい絞り込みはすでにキャッチした結果の条件分岐でもできる。
でも、なんか手抜きというか作法としてどうかという感じもしないではない。 例外が起こるまで想定内なら基本的に拾うべきでは
それで走らせてちゃんと例外拾って正常終了すれば、そこまでは思い通りに動けてるってことだし
予期される例外が起こるか起きないかわからなくて、かつそれが全体的に支障を来さないと断定できるなら
条件文で避けるのもあるかもだがなんかきもいな そういう意味なら、最終的にプログラムが速く動くように使い分ける
(最後に本音がある)
以下、例外をスローする関数を関数t
事前条件を検証する関数を関数cとする
関数t: 呼び出しが低コスト、かつ呼び出し回数が少ない
→try~catch
関数c: 関数tと同等の呼び出しコスト
→try~catch
関数t: 呼び出しが高コスト、または呼び出し回数が多い
関数c: 事前条件の判定に成功したら関数tは例外をスローしない
→if
関数t: 呼び出しが高コスト、または呼び出し回数が多い
関数c: 事前条件の判定に成功しても関数tは例外をスローすることがある
→if+try~catch
…新人に聞かれたらこう答えるかな
実際は長時間ブン回す機械学習ならともかく、Pythonで速度を気にしても仕方がないケースが多いので
あまり厳密に考えてはいない… >>850
Python とかの例外機構が備わってる言語だとそれぐらいですむけどC言語とかでまともに異常処理を行うと 2/3 程度は異常処理になるのはよくある 何かとすぐ速度って言葉でマウント取るけど例外キャッチは書き手の意図を拾うって意味でも大事でしょ
例外を迂回しただけだったら例外でる可能性についてどこまで書き手が想定してるのか分からない
例外キャッチが明文化されていれば少なくとも意図された挙動の範疇かどうかはすぐにわかる 何かとマウントって言葉が出てくる繊細チンピラ。
死ぬまでママとだけお話しててくんねーかな。 今から大事な事言うからよく聞けおまけら
例外はキャッチするな なんでpythonの例外の話してるのに
CとかJavaの例出してくるの?
馬鹿なの? fuga = "{},{},{}\n".format(
hoge[0],
hoge[1],
hoge[2],
)
output.write(fuga)
って感じのことをしたいんですが、hoge[300]とかまで続くときはどうしたら良いのでしょう? fuga = '{}\n'.format(','.join(f'{_}' for _ in hoge)) fmt = "{}" + (",{}" * (len(hoge) - 1)) + "\n"
fuga = fmt.format(*hoge) hoge = ["さんま","うなぎ","カッパ"]
fmt = "{}" + (",{}" * (len(hoge) - 1)) + "\n"
fuga = fmt.format(
hoge[0].replace("さんま","ぐんま")
)
これだと
hoge[1]
hoge[2]に変更が無いとしても書かないとエラーになりますよね?
hogeが300個くらいあるとき、どうしたら良いでしょう? イマイチやりたいことが見えないが、
fuga =",".join([str(s).replace("さんま","ぐんま") for s in hoge])+ "\n" >>865
ありがとうございます。
補足説明したいのですが、いかんせん私が初心者すぎて説明すら難しいのです。
joinを調べてみます。 なんというか列300、行400くらいのファイルが有りまして。
一行毎に変換処理を書いてるのですが、列は処理しない項目が多いのです。
300の内、10項目ほどしか処理が無いのです。
hoge[0]〜hoge[300]とか力技でも良いかなと思って書いてますが、"変換しない"箇所はスキップできないかなーと思っているしだいです。 あ、ファイルはcsvでカンマでsplitしています。 import csv
with open("1.csv") as input:
writer = csv.writer(output)
reader = csv.reader(input)
for row in reader:
row[0] = row[0].replace("さんま", "ぐんま")
writer.writerow(row) fuga =",".join(str(s).replace("さんま","ぐんま") for s in hoge if s == 0)+ "\n"
じゃないのか >>868
csvならpandas使ったらいいよ。ちょっと慣れないとつかいにくいけど色々と処理も用意されてるし、速いし。 ありがとう、pandasは選択肢に入っていますが基本的な処理を覚えたいので使用せずに試行錯誤しています spyderの変数エクスプローラーの表示を暗くしたいんだけど何かいい方法ないですか? prettytableについて質問です。
以下の場合、City nameは左揃え、AreaとAnnual Rainfallは右揃えになるんですが、
ヘッダのみ中央揃えにするにはどう書けばよいんでしょうか?
$ vim alignment.py
#!/usr/bin/python3
from prettytable import PrettyTable
x = PrettyTable()
x.field_names = ["City name", "Area", "Population", "Annual Rainfall"]
x.align["City name"] = "l"
x.align["Area"] = "r"
x.align["Annual Rainfall"] = "r"
x.add_row(["Adelaide", 1295, 1158259, 600.5])
x.add_row(["Brisbane", 5905, 1857594, 1146.4])
x.add_row(["Darwin", 112, 120900, 1714.7])
print(x)
$ ./alignment.py
+-----------+------+------------+-----------------+
| City name | Area | Population | Annual Rainfall |
+-----------+------+------------+-----------------+
| Adelaide | 1295 | 1158259 | 600.5 |
| Brisbane | 5905 | 1857594 | 1146.4 |
| Darwin | 112 | 120900 | 1714.7 |
+-----------+------+------------+-----------------+ >>876
同じくGitHubにあるcsv_normalなら最終出力の表示フォーマットを微調整できますよ
https://ideone.com/PYTaRs すいませんめっちゃ初心者なんですけど
>>> "5" + 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't convert 'int' object to str implicitly
>>> "5" - 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for -: 'str' and 'int'
こんな感じで
"5" + 1と"5" - 1という非常に類似した二つの「異なる型どうしの操作で起こるエラー」が
全く違うエラー内容になるのはなぜですかね。
Python3です。 知らんけど文字列同士の+は定義されてるけど-はされてないからじゃないけ 研究室のMatlabが2017bから更新されないからPythonに移行したくてMatlabと似た使用感のSpyder使い始めたけど
古いMatlabでもグラフ作成はPythonより圧倒的にやりやすいから移行できない
下記のQiitaの記事読んだけどいまいち自由自在に操作できない
https://qiita.com/skotaro/items/08dc0b8c5704c94eafb9 >>877
どうもありがとうございます
prittytableではヘッダのみ中央揃え、内容は左揃えってやるのはムリでしょうか? >>878-879
文字列の+ は、文字列の連結じゃないの? >>888
とすると
"5" + 1
の場合は1が整数型だという点で、
"5" - 1
の場合は"5"が文字列型だという点でエラーが起きたという認識でよいですか。 ああなるほど
試しに
5 + "1"
とやると
"5" - 1
とやったときとほぼ一緒の内容の警告(strとintが逆、-と+演算子が違うだけ)が出力されました。
なにぶんこの時分になってPython初心者なので変な質問をしてすいませんでした。
とりあえず自分のなかでは納得できました。
「Pythonは他の一般的な言語と同様に左から解析をしていき、
演算子は左項の型推論で得られた結果によってその意味を変えることがある」
ということですね。 Ruby と同じ。
2項演算子は、左側の型のメソッドになるのかな?
文字列型の、+ メソッドは、文字列の連結 同じと言われましても、そのlubii?とか言う泡沫言語なんて知りませんし興味もありません。
本屋の棚に、そんな言語有りませんでしたよ?
pythonは一棚占有してましたが。 >>891
あーなるほど
ちょっとというかかなり蛇足ですが
JavaScriptだと(有名なのでご存知かもしれません)
console.log("5" + 1)
51
console.log("5" - 1)
4
という処理をするんですよね。Pythonだとどうなのかなと気になったので。 >>887
たぶんムリっぽいですね〜、分からないですけど、、見た感じムリっぽいですぅー オライリー のPythonによるWebスクレイピングって本買ったんだがこれは機械翻訳か?
パラっと見てるがtreeが木でPrintは印刷となってて酷いぞ
意味のわからない日本語が時々出てくるんだがそれももしかして直訳なのかと思うとゾッとする today = datetime.today()
today_date = datetime.strftime(today, '%Y-%m-%d')
print(today_date)
朝の5時から翌日の5時前今日の扱いにしたい時はどうしたらいいでしょうか? today -= timedelta(hours=5) numpyの
アダマール積の値が大きいほど
2つの行列は近似的な物だと判断できるんですか? >>901
うん それだ
写経してみた おもろいな スクリプトを動かしていて任意のタイミングで終了させるにはどんな方法がありますか?
例えば、キーボードのQを押すとスクリプトが終了するようにさせたいです。 コントロールCを使うのが一般的ですか?
popenのwaitを使ってみてるんですけれど、ctrl+Cで止めると
Traceback何々が数行表示されるので、この表示が出ない逃したいいなと思いました。
停止させたら、任意の文字も表示できればもっといいです。 >>907
何が一般的か知らない。
任意のキーで停止できるようにしたいならcursesとか使うんだろうなと思うけど、おれは使ったことないからわからん。
お手軽にやりたいならctrl+cで止まるようにして、KeyboardInteruptを例外処理しとけば楽かと。 >>905
>>907
シグナルハンドラで調べるとよろし https://docs.python.jp/3/library/venv.html
Python3のvenv仮想環境を使おうと思うのですが
インストール先の推奨パスとかありますかね。
ブログを見たりすると~/venv36とかみたいなんですが、できればホームディレクトリには置きたくないです。
もう少し体系化された場所に置きたいです。 すいませんpython3-venvパッケージが提供されていたのでそれを使用することにしました。
ちなみに/usr/lib/python3.5/venvでした。 レス数が900を超えています。1000を超えると表示できなくなるよ。