【まず1嫁】くだすれPython(超初心者用) その53

■ このスレッドは過去ログ倉庫に格納されています
2021/03/16(火) 07:19:44.36ID:PfTIXkDh
当スレに★Python以外のプログラミング言語での回答類を書くべからず★
派生言語はそれぞれ専スレがあるのでそっち池。
「Ruby」「某言語では」をNGワード登録推奨。荒らしは、完全スルー放置が一番きらいです。

このスレッドは「お勉強」スレのほうには書き込めない超低レベル、
もしくは質問者自身何が何だか分からない質問を、勇気を持って書き込むスレッドです。
へび使いが優しくコメントを返しますので、お礼は Python の布教と初心者の救済をお願いします。

★エラーを解決したい場合は、
  表示されてるエラー全文(勝手に省略やスクショうp等の横着クソ行為禁止)と、
  実行環境(Pythonのバージョン・OSとIDEの種類とバージョン)をシッカリ書くこと。

Pythonの★ソースコードをそのまま5ちゃんにコピペすると、インデントが崩れてチヌ★
5chの仕様【【【複数の連続半角スペースはなにもなかったことにされる&タブは普通には入れられない】】】のため、どうにもなりましぇん。
↓等の、いわゆるコードうp用サイトに貼ってこいください。
ttps://techiedelight.com/compiler/  Run Code機能あり。
ttp://ideone.com/      デフォ設定はC用のため、言語選択ボタン押下がピコ手間かも。
ttp://codepad.org/      ほぼ直感的に使える。Run codeボタンあり。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Python公式サイト◇ http://www.python.org/
◇まとめwiki◇ ttp://python.rdy.jp/wiki.cgi

〇前スレ〇 くだすれPython(超初心者用) その52【まず1嫁】
https://mevius.5ch.net/test/read.cgi/tech/1610137345/

次スレは >>985 あたりが挑戦してくだしあ。(980過ぎて自動落ちは、無くなって久しい)
### END OF TEMPLATE ###
2021/05/01(土) 17:57:55.31ID:qiYKVwJr
PyQtで自動生成されるuiソースもflake8で結構色々でますね。
自分のソースは通信系なのでtry/except入れているのでsyntaxエラーさえも例外で通信リカバリーみたいになるので悩んでました。
498デフォルトの名無しさん
垢版 |
2021/05/01(土) 21:57:09.95ID:qfW/WcRP
>>496
Syntax Errorはちゃんとでるんでないかい?
一方で、こういう逆のケースはある。
globals()['tau'] = 6.283185
print(tau) # linterやIDEではエラーとでるけど、実際にはちゃんと動く
2021/05/02(日) 15:17:35.67ID:v2ZnBcL1
a = ['a','b','c']
if not a[3]:
_print()

javascriptみたいにundefinedになってくれればと思ったのですが
pythonはIndexErrorが出るみたいですね
これを場合分けしようと思うと、try使うしかないですよね?
list index out of rangeの場合はelseそれ以外は値を取得
みたいにifだけ書きたいと思ったんですけどね
2021/05/02(日) 15:20:45.85ID:Eu1LZK3p
idx < len(a)でインデックスが範囲内にあることを確認するとか?
2021/05/02(日) 15:20:49.97ID:zAlV+S16
dictならそういうのあるけどlistはないな
len(list)で長さ確認してから取得するか、try-catchするしか無い
502デフォルトの名無しさん
垢版 |
2021/05/02(日) 20:42:49.07ID:x2TfprvW
if not a[3:]:
で ok
503デフォルトの名無しさん
垢版 |
2021/05/02(日) 23:59:52.42ID:Qiy/T2Qn
listを拡張して独自クラスを定義するのはどうか

class DefaultList(list):
__def __getitem__(self,i):
____if i<len(self):
______return super().__getitem__(i)
____else:
______return None

a=DefaultList([‘a’,’b’,’c’])
if not a[3]:
2021/05/03(月) 00:41:21.84ID:4Jcj15/I
>>502
スライス範囲を絞ってif not a[idx: idx + 1]とかにしたらより速くなりそう
505デフォルトの名無しさん
垢版 |
2021/05/03(月) 08:29:57.06ID:oY4C2yCE
いきなりStopIterationで止まるだけだから、長さ関係ないだろ。
普通にlenでいい。
JavaScriptやPHPのリスト"もどき"と比べるのもナンセンス。
506デフォルトの名無しさん
垢版 |
2021/05/03(月) 09:20:58.90ID:TDKc9ux4
環境はwindows10 64bitです

親フォルダ
:子フォルダA:画像1.画像2
:子フォルダB:画像1..

という構造があって,pathlibで生成した子フォルダのpathをiterdir()で回して
画像pathをPILのImage.openで読もうとしてるんですが
親か子のフォルダ名がめっちゃ長くなると
FileNotFoundError: [Errno 2] No such file or directoryになるやつが出たり出なかったりします
フォルダ名を短くして,画像名を最大まで長くした場合はエラーが出ません
何が原因で,どうすれば読めるようにできますか?
できればエラーキャッチしてその場で読めるようにしたい (フォルダ名のリネームはとりあえず置いておきたい)
2021/05/03(月) 09:25:40.83ID:YjR4A9Iz
>>506
フルパスが長すぎてpython内であふれてしまうのが原因
フルパスではなくショートパスを生成して、それでやりとりするようにすればとりま回避できるが
あまりに長いフルパスは非推奨なのでとりま置いておいたとしてもいつかは直せ
2021/05/03(月) 09:47:03.23ID:GN4IAf32
PythonじゃなくてWindowsのせい

多分これでしょう
Windowsはデフォで絶対パス260文字制限があるらしいから、解除したいならレジストリをいじる必要がある
https://bizlog.tech/windows-maxpath-change/
509デフォルトの名無しさん
垢版 |
2021/05/03(月) 09:59:34.50ID:YBya6Fwz
フォルダ名はわかるけど
ファイル名長いのが大丈夫なのはなんでだ?
510デフォルトの名無しさん
垢版 |
2021/05/03(月) 12:48:07.42ID:TDKc9ux4
>>507
なるほど
今回はpyinstaller使いたくて、そうするとwin32apiとの相性が悪いっつーかショートパスが危険球っぽいんで
もうロングパスは受け付けないことにします。ありがとうございました
2021/05/03(月) 12:52:29.86ID:YjR4A9Iz
>>509
それには一部対応してるんでねーの

>>510
pyInstallerはパスの途中に半角スペースや全角文字あってもうまくいかないことがあるぞ
2021/05/03(月) 18:53:48.47ID:YjR4A9Iz
>>510追記
ところで、相対パス/絶対パス/フルパス/短縮(ショート)パスの違いはわかってるんだよな???
513デフォルトの名無しさん
垢版 |
2021/05/03(月) 23:59:09.62ID:9/VcaNVK
その情報要る?
たぶん抜本的には裏で構造体を丸ごと短い名前でコピーして、それを処理して返すようにするとかいう話じゃね
514デフォルトの名無しさん
垢版 |
2021/05/04(火) 00:11:11.66ID:MueeR1Ae
まあショートネームは避けたい
そもそも超ロングパスがあり得る環境だとショートパス化できない文字列がぶち込まれそうだし
長いのはエラー吐くか
コピー→リネーム→処理→置き換え たい
2021/05/04(火) 00:59:43.45ID:Zkcb+r3V
Windowsの場合はPythonのインストールの最後に260文字制限を解除するか
聞かれたような気がする
516デフォルトの名無しさん
垢版 |
2021/05/04(火) 11:15:39.91ID:MTtoo9am
win上のpythonて32767文字扱えないのか
517デフォルトの名無しさん
垢版 |
2021/05/04(火) 12:20:24.62ID:g/PMv139
windowsのロングパスは
ファイル造ったあとに自分でそのファイルにアクセス出来ないとか
削除も出来ないとかあほなことに巻き込まれる

>>516
stringio
2021/05/04(火) 14:21:30.25ID:QySiaJ1m
以下のようなデータセットのリストがあり、例えば各nameごとに、valueが最大となるものだけ抽出したい場合に内包表記や関数などで簡単に書ける方法はありますか?
[
{'name': 'a', 'value': 100},
{'name': 'a', 'value': 200},
{'name': 'b', 'value': 50},
{'name': 'b', 'value': 105},
{'name': 'c', 'value': 150}
]

↓こういうリストとして抽出したいです。
[
{'name': 'a', 'value': 200},
{'name': 'b', 'value': 105},
{'name': 'c', 'value': 150}
]
valueはタイムスタンプ等で最新のものだけ抽出する、といった使い方をしたいです。
2021/05/04(火) 14:46:49.13ID:7YaPXlVC
聞く限りだとfor name, value in data:とかで回して
out[name] = max(out[name], value)
みたいな感じで処理したら良さそうだけど
2021/05/04(火) 15:14:35.45ID:E49Bjnaf
df.groupby('name').max()
2021/05/04(火) 15:16:48.68ID:QySiaJ1m
>>519
ありがとうございます。
後出しで申し訳ないのですが、各データはvalue以外にも複数の属性値をもった辞書データになってます。
nameは抽出後は当然ユニークになりますが、抽出後もリストのままで並びも元の並びはキープしておきたいです。

SQLで言う、GROUP BYしてMAX関数適用するような感じの抽出方法はないかなと思いまして。
2021/05/04(火) 15:20:08.13ID:QySiaJ1m
>>520
あ、まさにそのイメージでした。ありがとうございます。

やはりdataFrame使わないと簡単には書けないのですね?言い換えるとdf使った方がはるかに簡単ということですかね。
2021/05/04(火) 15:35:54.90ID:LRawq6Xg
一応pythonの組み込みライブラリにもgroupbyってあったよね
pandasでやるのが一番手っ取り早いと思うけど
2021/05/04(火) 16:05:52.03ID:Z3Fw33AT
Ruby なら、

input = [ {'name': 'a', 'value': 100}, {'name': 'c', 'value': 150}, {'name': 'a', 'value': 200} ]

result = input.group_by{ |hash| hash[ :name ] }.map do |ary|
ary[ 1 ].max_by{ |hash| hash[ :value ] }
end

p result #=> [{:name=>"a", :value=>200}, {:name=>"c", :value=>150}]
525デフォルトの名無しさん
垢版 |
2021/05/04(火) 16:52:55.89ID:sM9M0m2z
>>524
グロ
2021/05/04(火) 16:53:31.46ID:plXKAz40
おっルビおじw
527デフォルトの名無しさん
垢版 |
2021/05/04(火) 17:23:42.38ID:5sA+/wAg
>>518
愚直に内包表記
[
{‘name’:name, ‘value’:max(record[‘value’] for record in data if record[‘name’]==name)}
for name in set(r[‘name’] for r in data)
]

ただしnameの並びは崩れる
528デフォルトの名無しさん
垢版 |
2021/05/04(火) 19:52:15.91ID:ns0mTqm6
pathlib.iterdir()の読み込み順ってどういう仕組みで制御されてるのかな
windowsは昇順001>0001なんだけど、natsortとかos_sortedでも0001>001になるのが
pathlibのジェネレーターはOSソートに追従してる気がする…偶然?
529デフォルトの名無しさん
垢版 |
2021/05/05(水) 08:36:34.57ID:/UG/+rZL
ちょっと試してみたんだけど

01.txt
1.txt
2.txt
0010.txt
a.a.01.txt
a.a001.txt

explolerの名前の昇順でこう表示されるディレクトリを
同じ並びで出力するソート形式はないような気がする
natsortもos_sortedも効かないw
すごいなwindowsどうなってんだ
530デフォルトの名無しさん
垢版 |
2021/05/05(水) 08:55:12.40ID:XnkETAr1
[natsorted[数字だけのファイル], sorted[文字あり]]

うーん……
2021/05/05(水) 09:20:35.28ID:szdX8X2R
windowsのファイル名ソートアルゴリズムが謎
2021/05/05(水) 09:30:37.39ID:wUp61E7s
その謎、前からあるやで
2021/05/05(水) 10:06:42.44ID:0XQqNpVi
Win32APIのStrCmpLogicalW
534デフォルトの名無しさん
垢版 |
2021/05/05(水) 11:25:44.55ID:/UG/+rZL
>>533
https://i.imgur.com/nY9LmRN.png
こうかー. 難しかった
たいへん勉強になりました
2021/05/05(水) 11:29:21.21ID:9+xzMV/Q
うわぁ…
2021/05/05(水) 12:30:31.81ID:gzgZcJa9
OSリリースごとに結果が変わる可能性があるので正規化に使用してはいけませんとか注意書きが書あるAPI
2021/05/05(水) 13:00:05.01ID:kj6fybeU
>>531
https://web.archive.org/web/19990224184613/http://www.asahi-net.or.jp/~ez3k-msym/comp/acccoll.htm
2021/05/05(水) 14:28:38.34ID:wUp61E7s
>>536
XP→10で変わって戸惑ったきおく
2021/05/05(水) 15:35:37.41ID:dvz+9Kky
定期的にこの話題でるな
2021/05/05(水) 16:25:24.24ID:7m6bX2W0
>>534
__le__, __ge__, __ne__がそれぞれ1, -1, 0と比較してるのって間違ってない?
使われなくて影響ないのかもだけど

functoolsのcmp_to_keyを使えば
sorted(paths, key=cmp_to_key(win_cmp))で済むよ

同じAPI使ってるのにソート結果が違うのは
os_sortedのバグだと思うのでissueあげとくといいかも
2021/05/05(水) 18:38:45.20ID:sGblmxZ3
from functools import cmp_to_key
import ctyps

def win_sort(obj):
__def win_cmp(s1, s2):
____shlw = ctypes.windll.LoadLibrary("SHLWAPI.dll")
____return shlw.StrCmpLogicalW(str(s1), str(s2))
__return sorted(obj, key=cmp_to_key(win_cmp))

なるほど
2021/05/05(水) 19:54:48.41ID:MgJEgPkj
>>534
cmp_to_keyと同じことしてる
それはともかく
key=absとkey=cmp_to_key(とでは
ぜんぜん違う形式
内部的にやってることに馴染むのが難しい
543デフォルトの名無しさん
垢版 |
2021/05/06(木) 03:36:21.23ID:Za2B/gSh
tkinterでMVCに挑戦してるんですが
例えばapp.verとかicon用base64文字列とかの定数?はどこに書くんでしょうか

アプリケーション(root)固有の情報は全部Cに書いてる人もいれば
非画像データはM、画像関係はVに置いてる人もいて
どう考えたらいいのか教えてください
544デフォルトの名無しさん
垢版 |
2021/05/06(木) 10:33:21.16ID:84/gBo5v
>>540
母胎osの仕様が変わるんだから手に負えない
545デフォルトの名無しさん
垢版 |
2021/05/06(木) 10:34:55.21ID:84/gBo5v
>>543
MでもVでもCでもない
リソース領域に描いておいてロード
546デフォルトの名無しさん
垢版 |
2021/05/06(木) 19:28:22.80ID:yKLn4IC5
tkinterで応答なしを回避するには
別スレッドに処理投げるしかない?

できればthreading使いたくない
2021/05/06(木) 19:30:05.47ID:1p3Rvf0Y
Winならレジストリいじってタイムアウトと判断する秒数を変える
2021/05/06(木) 20:30:14.34ID:v54vsLS/
import pandas as pd
df = pd.DataFrame([['ia','ib','ic'],['id','ie','if']],columns=['a','b','c'])
if not df==None:
_print(df)

ってやると
ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
というエラーが出ましたが
仮にdf=Noneだった場合にdf.all()とかやると今度はNoneはallを持ってません的なエラーがでます
こういうときってどう対応すればよいでしょうか
2021/05/06(木) 20:33:45.39ID:v54vsLS/
ちなみに今は
if not str(df)=='None':
ってやってます
2021/05/06(木) 20:54:15.24ID:yh3xJpCx
>>548
そもそもNone判定したい場合は==じゃなくてisを使う
if df is Not None:
みたいな書き方にする必要がある

で、注意点として
df = pd.DataFrame()
みたいに、空のデータフレームで初期化してる場合はNoneではない(is Noneで判定してもFalseで返ってくる)
空かどうかを判定したい場合はemptyを使う
2021/05/06(木) 20:54:36.39ID:PCWSPh5c
if df is not None:
に変える

理屈は込み入っているので他の人にお任せする
2021/05/06(木) 20:59:03.00ID:yh3xJpCx
間違ってNotが大文字になってた……notが正しい
2021/05/06(木) 21:14:18.42ID:v54vsLS/
>>550,551
なるほど isでしたか
さっそく書き換えてみたらうまくいきました
ありがとうございます
554515
垢版 |
2021/05/06(木) 22:01:24.30ID:DEG1F9Nj
>>506
pythonの初回インストール時に以下の英文が表示されるので
この英文部分をクリック

Disable path length limit
Changes your machine configuration to allow programs,including Python,
to bypass the 260 character”MAX_PATH” limitation.

pythonのアップデートもかねて
今使ってるバージョンの最新版インストーラーを公式からダウンロードして実行し
最後のダイアログに上の英文が表示されたらクリックしてみて
555デフォルトの名無しさん
垢版 |
2021/05/07(金) 00:28:15.35ID:TdDivYCp
>>554
配布用なのでロングパスは許さんマンにしました…
556デフォルトの名無しさん
垢版 |
2021/05/07(金) 05:18:06.85ID:yOYKTU3u
if df:
じゃだめなの
557デフォルトの名無しさん
垢版 |
2021/05/07(金) 05:30:41.77ID:FZBmU73W
一連の作業のなかで
2回同じ相手にループ処理をします
一回は存在確認、もう一回はデータ取得
処理の距離が結構離れてるんだけど、一回目のときにデータ取得もして放置しておくことはできます

こういうとき、きちんと2回に分けた方がいいですか?
一回でガバっとやっていいですか?
2021/05/07(金) 10:57:12.07ID:O1URPzeE
>>557
ケースバイケース

何のために2回に分けたいのか、もしくは1回にまとめたいのかという目的を明確にした上で
漠然とした状況をもっと特定する必要がある
559デフォルトの名無しさん
垢版 |
2021/05/07(金) 11:37:20.61ID:fHTm+yKw
>>546
after() after_cancel() を多用するイメージ
560デフォルトの名無しさん
垢版 |
2021/05/07(金) 11:39:40.44ID:fHTm+yKw
>>557
2回目までに消えてる可能性が無いと保証されてるならいつでもいい
2021/05/07(金) 12:31:30.97ID:MaAf4oEf
現在のバージョンがPython 3.8.7 - Dec. 21, 2020とした場合
同じ3.8系の中から現時点で最新のPython 3.8.10 - May 3, 2021をインストール
3.8系から3.9とか3.10に変えると、pipを使ってインストールしたパッケージが動かないことがある
かもしれないので変えないほうが良いと思う

how to Update Python to the Latest Version
https://www.youtube.com/watch?v=UXSxBx8eG28
2021/05/07(金) 20:02:05.37ID:StgLFl94
コールバック関数の説明は、
公式ドキュメントのどこに書いてありますか?
2021/05/07(金) 20:42:35.41ID:HcCkNDs0
bindで探せば情報はある
bindの実装をソースで見れば
わかるんじゃ
コールバック関数自体はただの関数が
コールバックで呼ばれてるだけなので
説明とかあるかな
564デフォルトの名無しさん
垢版 |
2021/05/07(金) 22:32:12.12ID:TdDivYCp
max(0, 10)
で10が返るのはなぜですか?
565デフォルトの名無しさん
垢版 |
2021/05/07(金) 22:32:58.62ID:TdDivYCp
あ、もうしわけない
これkeyじゃないんですね
早とちりしました…
566デフォルトの名無しさん
垢版 |
2021/05/08(土) 08:55:22.68ID:DE4arKCM
全体的に人がいないね。
567デフォルトの名無しさん
垢版 |
2021/05/09(日) 17:43:20.28ID:29Yn0Nuv
ttps://techiedelight.com/compiler/?AUYY

こういう練習問題があるんだが、こういうアルゴリズム?をぱっと思いつくようになるにはどうしたらいいんだろうか
何度も挑戦したからもはや覚えてしまったんだが、似たような問題出されても答えられる気がしないし
ゴールとしては問題形式ではなく自分のプログラミングで出てくる必要があるんだろうし
2021/05/09(日) 17:52:07.18ID:E0SRP95C
自分の手でやるとしたらどうするか考える
その手順をフローチャートに書き出す
それを素直にコードに落とす
それをイケてる感じにリファクタリングする

まあ実際そんなのできなくてもモノは作れるし、特にPythonはそういうアルゴリズム書ける人は少ないと思うよ
2021/05/09(日) 18:07:38.33ID:E0SRP95C
あとは、問題の細分化だな
これはアルゴリズムの実装に限らずプログラミングにおいて常に有効な考え方だ
例えば、str1の指定した位置iから始まる位置に文字列str2があるかどうかを調べて返す関数 submatch(str1, str2, i) があれば、
この submatch を i を増やしながら str1 全体にわたって適用すれば解けるだろ?
で次はこの submatch をさらに細分化する、それを自分が簡単に実装できる十分簡単な問題になるまで繰り返す
2021/05/09(日) 18:08:31.75ID:lcdfGCto
まず条件を満たしているということはどういうことかを考える
判定する方法がわかったら脳死で実装する
どれだけクソなコードが出来上がったかを観察してまともにする
2021/05/09(日) 19:04:21.95ID:CGDxHqdD
自分が頭の中でどうやってその問題を解いてるかをコードに落とし込むのが一番単純かもね

問題が簡単じゃないとこの方法は難しいけど
2021/05/09(日) 19:22:45.44ID:LMLrHz7X
答えはこうじゃないの
def simple_match(str1,str2)
return str1.find(str2)
573567
垢版 |
2021/05/09(日) 19:47:04.83ID:29Yn0Nuv
>>568
フローチャート作るときはどんなアプリ、ウェブサービス使ってるのかな?

細分化すると、細分化されたもの同士をつなぐところでつまづきがちだなあ
2021/05/09(日) 19:48:52.28ID:E0SRP95C
>>573
フローチャートは成果物として残すものではない
そこらへんの紙に書け
2021/05/09(日) 20:01:01.07ID:6ong4OY9
>>567
全然関係ないツッコミで恐縮なのだが問題文と実装あってなくね?
問題文の方がおかしそうだけど
576567
垢版 |
2021/05/09(日) 20:16:54.70ID:29Yn0Nuv
>>575
問題文と実装が正しいかどうかを把握する能力がないので具体的に教えてもらえると助かる
一応、答えとして掲載されているから正しいとは思うが
問題分もコピペしただけ
文字列のメソッドやモジュール(正規表現など)使うなとも書いてあったが

https://utokyo-ipp.github.io/3/3-2.html
while文による繰り返し、の下の方の練習問題
577デフォルトの名無しさん
垢版 |
2021/05/09(日) 20:35:42.76ID:Fj+EbY4X
>>567
自分が計算機になったと思って具体的な入力から出力を手で求めろ
するべき処理が見えてくる
2021/05/09(日) 21:06:48.89ID:6ong4OY9
>>576
や、ほぼ日本語だけの問題
> str2 が str1 を部分文字列として含むかどうか判定する関数
例だとstr1がlocation、str2がcat、これで期待される戻り値が2なんでしょ?
str1がstr2を部分文字列として含むかどうか、あるいは、str2がstr1に部分文字列として含まれるかどうか、が関数の仕様として適切だと思うけど

こっちの頭が狂ってる? なんか不安になってきた
2021/05/09(日) 21:20:07.31ID:MVBjVGaC
問題文の日本語が間違ってるね
str1やstr2みたいな悪い命名の見本

これほんとに東大の人間が作ってるんだとしたらヤバいな
580567
垢版 |
2021/05/09(日) 22:08:42.45ID:29Yn0Nuv
>>578
ああそういうことか
たしかに一部入れ替わってるかもね
>>579
命名するとしたらどんなのがいいの?
参考になるサイトとかあるのかな
2021/05/09(日) 22:43:11.51ID:4LY/LzCs
>>580
変数名とかの良い付け方とかは、基本的には誰が見ても分かるってのが大前提だね
(この辺の話は、リーダブルコード、ベタープログラマ、達人プログラマーみたいなコーディング作法本に詳しく書いてある)

自分が付けるならsrc_strとtarget_strって付けちゃうかな……
(自分も勉強中なのでこれ最善かは知らん、もっと一般的に良い名前があるかもしれないけど)
2021/05/09(日) 23:17:56.42ID:MVBjVGaC
>>580
簡単なものならtext, patternとか
とにかく意味の違いを名前に反映させる
str1とstr2じゃどっちがどっちか全然わからない
意図を伝えるのが大事

命名で参考にするのはその言語の標準ライブラリと
使い方がわかりやすいようなライブラリ
(str.find(sub, start, end)を参考にすればsimple_match(string, sub_string)とか)
2021/05/09(日) 23:29:01.12ID:MVBjVGaC
>>567
算数と同じで問題や解き方を図で捉えるようにすれば理解が捗るし応用も効きやすい

その解答例は2つの配列の単純な総当たりと根本は同じ
文字列(配列)のインデックスをそれぞれ進めたりリセットしながら比較する様子を
図にして脳内アニメーションで再生できれば似たような問題にも対応できる
2021/05/09(日) 23:42:28.80ID:yYD7w3ek
Cをやってみれば良いんじゃね?
2021/05/09(日) 23:50:37.41ID:uTd1VsWW
Bから始めよう
586567
垢版 |
2021/05/10(月) 03:25:25.87ID:oDeb4Nzy
模範解答を使わず、自分の実力ならこんな感じに作るだろうなってのを改めて作ってみた
https://techiedelight.com/compiler/?~0jNN

2重ループの中で str1[ i ] と str2[ J ] をくらべりゃいいんだろ
みたいなことをやって不具合を小手先で正した

模範解答の
https://techiedelight.com/compiler/?AUYY

while j < len(str2) and str1[i+j] == str[j]

なんて一生かかっても思いつけない気がする……

あとここの掲示板のせいだと思うんだけど
自宅の回線でこのスレにURL付きの投稿しようとすると、数時間書き込み規制になる
だからずっとスマホで書き込みしてる
587デフォルトの名無しさん
垢版 |
2021/05/10(月) 04:11:00.85ID:HXPAQUt8
文字単位の処理方法を考える前にこんなのを考えちゃうなぁ
def f(a, b):
____ la, lb = len(a), len(b)
____ for i in range(la - lb + 1):
________ if a[i : i + lb] == b: return i
____ return -1
print(f("hello","el"))
2021/05/10(月) 07:25:33.08ID:ZcdY0167
ここにいる人に言うまでもないとは思うけれど、KMP法など使うと時間計算量をO(S1*S2)ではなくO(S1+S2)で解くことができます
2021/05/10(月) 11:17:21.89ID:hyNFKJLf
>>586
正しく動作するのかなぁ。jのループの中でiを加算しちゃってるけど。
2021/05/10(月) 11:37:45.73ID:giJ6lOgz
>>586
模範解答を使わないやつを少し圧縮するとこういう感じになる

def simple_match(str1, str2):
____for i in range(len(str1) - len(str2) + 1):
________a = 0
________for j in range(len(str2)):
____________if str1[i+j] == str2[j]:
________________a += 1
________________if a == len(str2):
____________________return i
____return -1

5行目のif文は実質的にはloopの継続判定だけど
pythonのfor-loopでは直接それを表現できないのでwhileに置き換えたのが模範解答

アルゴリズムそのものを理解するということと
アルゴリズムを特定の言語で表現する方法を知るということとは少し分けて考えたほうがいいかも
591デフォルトの名無しさん
垢版 |
2021/05/10(月) 13:22:46.52ID:QDSNEet8
基本的なものでもあらかじめ知ってた方が早い

高速文字列解析の世界 - 岩波書店
https://www.iwanami.co.jp/book/b257894.html

こういうのも読んで>>567の言う通りに暗記したものを思い出すしかない
なので思い付いてるのは1割未満
592デフォルトの名無しさん
垢版 |
2021/05/10(月) 15:11:13.59ID:lCZGOQhN
str1 とか str2 とかはともかく
変数名に str や string を使う香具師は筋が悪い
2021/05/10(月) 16:45:53.24ID:auO1c8Ib
関数が汎用的になればなるほど変数名も抽象化されてしまうのは仕方がない
仮にstrlen関数がpythonにあったら、分かりやすい仮引数名はstrかstringしか思いつかんわ
594デフォルトの名無しさん
垢版 |
2021/05/10(月) 16:54:27.06ID:BLE40/70
組み込み関数を変数名に使うんだね
2021/05/10(月) 17:32:17.10ID:loNnKCpC
>>593
阿鼻叫喚やな
2021/05/10(月) 18:33:52.38ID:giJ6lOgz
>>592
strと違ってstringはグローバルにおさえられてるわけじゃないから
文脈から何のstringか分かるようなら使っても問題ないよ
標準ライブラリやそのテストコードでも普通に使われてる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。