!extend:default:vvvvv:1000:1024
!extend:default:vvvvv:1000:1024
↑スレ立てる毎に減るので、減ってたら3つに補充すること。
・当スレにRubyのソースコード類を書くことを禁ず
・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止
・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨
・エラーを解決したいときは、かならず
エラー文(勝手に省略orスクショうp等の横着禁止)と
おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。
※前スレ
Pythonのお勉強 Part72
https://mevius.5ch.net/test/read.cgi/tech/1703659345/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
探検
Pythonのお勉強 Part73
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ f610-G7il)
2024/06/06(木) 08:48:10.07ID:DsazphEm0750デフォルトの名無しさん (ワッチョイ ad68-pbyY)
2024/08/27(火) 16:20:43.45ID:+d875zN80 >>749
なるほどやってみるか
なるほどやってみるか
751デフォルトの名無しさん (ワッチョイ fec5-H3pI)
2024/08/27(火) 19:17:56.22ID:Q1x0BOco0 大事なのはPythonで何やるかだろう
簡単なタスクを自動化するみたいなレベルなら四則演算できるレベルで十分
簡単なタスクを自動化するみたいなレベルなら四則演算できるレベルで十分
752デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/27(火) 19:34:11.22ID:Olv0GL3m0 プログラムはロジックで、数学は抽象化だからな
必要な素養が全然違う
必要な素養が全然違う
753デフォルトの名無しさん (ワッチョイ 4d9f-vhpZ)
2024/08/27(火) 20:18:30.22ID:s5Uqc+HW0 ロジックは分野関係なく当たり前の素養
挙げるとしたらモデル化能力
それには抽象化能力ないとね
挙げるとしたらモデル化能力
それには抽象化能力ないとね
754デフォルトの名無しさん (ワッチョイ cd01-FZk0)
2024/08/27(火) 20:27:14.51ID:l+VCbokh0 手計算で3日かかるの数秒で出来るのええやん
755デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/27(火) 20:31:30.23ID:Olv0GL3m0 一般社会のロジックとプログラムのロジックは別物
例外を一切認めないようなrigidなロジックはプログラム特有
例外を一切認めないようなrigidなロジックはプログラム特有
756デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/29(木) 09:40:06.31ID:1jszJs3na 良きに計らえ(シャチョーさん)
757デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 15:55:49.43ID:F2p43Zdw0 import re
s = 'abc\\n'
print(re.search('a(.+)\\\\n', s).groups()[0]) # bc
print(re.search('a(.+)\\n', s).groups()[0]) # error
何故こんな挙動に?
s = 'abc\\n'
print(re.search('a(.+)\\\\n', s).groups()[0]) # bc
print(re.search('a(.+)\\n', s).groups()[0]) # error
何故こんな挙動に?
758デフォルトの名無しさん (ワッチョイ 4d9f-vhpZ)
2024/08/29(木) 16:35:29.97ID:01fBpAqb0 >757
>>> len('abc\\n')
5
>>> len('abc\n')
4
>>> len(r"abc\n")
5
https://docs.python.org/ja/3.11/library/re.html#raw-string-notation
正規表現リテラルに関しては3番目のraw stringで書いた方がいい
>>> len('abc\\n')
5
>>> len('abc\n')
4
>>> len(r"abc\n")
5
https://docs.python.org/ja/3.11/library/re.html#raw-string-notation
正規表現リテラルに関しては3番目のraw stringで書いた方がいい
759デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 16:55:49.87ID:F2p43Zdw0 import re
s = 'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # bc
print(re.search(r'a(.+)\n', s).groups()[0]) # error
rで書いてもおかしい気がするんだよな
rなんだから\1個でいい筈なのに
s = 'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # bc
print(re.search(r'a(.+)\n', s).groups()[0]) # error
rで書いてもおかしい気がするんだよな
rなんだから\1個でいい筈なのに
760デフォルトの名無しさん (ワッチョイ 5e01-Twnj)
2024/08/29(木) 18:16:38.86ID:vHnGlZfZ0 Pythonのインタープリタが要求するバックスラッシュのエスケープと
正規表現が要求するバックスラッシュのエスケープと
二重にエスケープが必要だから
re.search(r'a(.+)\n', s)は改行コードの`\n`にマッチ
re.search(r’a(.+)\\n’, s)はバックスラッシュ+nという文字列にマッチ
正規表現エンジンに`\n`は改行コードじゃないよと伝えるのに
バックスラッシュをエスケープする必要がある
正規表現が要求するバックスラッシュのエスケープと
二重にエスケープが必要だから
re.search(r'a(.+)\n', s)は改行コードの`\n`にマッチ
re.search(r’a(.+)\\n’, s)はバックスラッシュ+nという文字列にマッチ
正規表現エンジンに`\n`は改行コードじゃないよと伝えるのに
バックスラッシュをエスケープする必要がある
761デフォルトの名無しさん (ワッチョイ 4d9f-vhpZ)
2024/08/29(木) 18:39:37.30ID:01fBpAqb0 s = 'abc\n' # abc+改行の4文字
じゃないの?ってことなんだけど
じゃないの?ってことなんだけど
762デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 18:42:15.14ID:F2p43Zdw0 rで書いてるなら、文字列中に\nを改行として書くことは諦めろとしか
rとはすべてがエスケープされてるモードなんだからエスケープ要らない約束の筈
rとはすべてがエスケープされてるモードなんだからエスケープ要らない約束の筈
763デフォルトの名無しさん (ワッチョイ 5e01-Twnj)
2024/08/29(木) 21:44:40.32ID:vHnGlZfZ0 >>762
正規表現ではバックスラッシュが特別なエスケープ文字として扱われるというのは理解してる?
それを理解してれば検索対象文字列に存在するバックスラッシュそのものにマッチさせるには
正規表現としてエスケープしたバックスラッシュ(=バックスラッシュ2つ)が必要というのはわかるよね?
s = 'abc\\n’にはバックスラッシュそのものが含まれてて
それにマッチさせたいわけだから正規表現として`\\`が必要になる
この正規表現でのエスケープはPythonが文字列を解釈するときのエスケープとは別のもの
正規表現ではバックスラッシュが特別なエスケープ文字として扱われるというのは理解してる?
それを理解してれば検索対象文字列に存在するバックスラッシュそのものにマッチさせるには
正規表現としてエスケープしたバックスラッシュ(=バックスラッシュ2つ)が必要というのはわかるよね?
s = 'abc\\n’にはバックスラッシュそのものが含まれてて
それにマッチさせたいわけだから正規表現として`\\`が必要になる
この正規表現でのエスケープはPythonが文字列を解釈するときのエスケープとは別のもの
764デフォルトの名無しさん (ワッチョイ 5e01-Twnj)
2024/08/29(木) 21:50:09.32ID:vHnGlZfZ0 一応書いておくけどバックスラッシュの二重エスケープが必要なのはPythonに限らずどの言語でも同じ
raw stringや正規表現リテラルを使った場合は一重エスケープでよくなる
raw stringや正規表現リテラルを使った場合は一重エスケープでよくなる
765デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 21:57:35.86ID:F2p43Zdw0 うちの店では昔っからこうなんだよと強弁されても
rawってのは生っていう意味で、未加工なんだよ
\nを改行の意味に変換したら加工しとるやろ
rawってのは生っていう意味で、未加工なんだよ
\nを改行の意味に変換したら加工しとるやろ
766デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 22:55:26.96ID:F2p43Zdw0 文字列の表現としてはrawでも、それを渡した先でどう扱われるかは別問題
という話なんだろうな
正規表現ですらなくて、誰かの作った関数で\nと連続してたらそれは改行文字として扱います
というお約束ならそれに従うしかない
\nを改行に変換するかもしれない仕組みを2回通すので、
変換されない為には2重のエスケープが必要
3回通すならもっと必要
raw表現はエスケープを1回減らす効果しか無い
という話なんだろうな
正規表現ですらなくて、誰かの作った関数で\nと連続してたらそれは改行文字として扱います
というお約束ならそれに従うしかない
\nを改行に変換するかもしれない仕組みを2回通すので、
変換されない為には2重のエスケープが必要
3回通すならもっと必要
raw表現はエスケープを1回減らす効果しか無い
767デフォルトの名無しさん (ワッチョイ 22e7-zZP0)
2024/08/29(木) 23:45:40.59ID:N4XBWKhx0 >>763
その指摘は正規表現の話ではない
その指摘は正規表現の話ではない
768デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/29(木) 23:52:54.64ID:F2p43Zdw0 raw文字列というpythonの仕様と、
reというpython標準のライブラリがごっちゃになって、
rawと書いたら受け取った人もrawとして扱う筈、というのはただの思いこみで、
受け取った側は元がどう書かれてたかなんか知る由もなくただのstrとして受け取って、
そこから独自の字句解釈を開始する、というだけの話
reというpython標準のライブラリがごっちゃになって、
rawと書いたら受け取った人もrawとして扱う筈、というのはただの思いこみで、
受け取った側は元がどう書かれてたかなんか知る由もなくただのstrとして受け取って、
そこから独自の字句解釈を開始する、というだけの話
769デフォルトの名無しさん (ワッチョイ 5e01-Twnj)
2024/08/30(金) 00:50:19.40ID:S+WRgUIX0 >>765
>\nを改行の意味に変換したら加工しとるやろ
raw文字列は\nを改行文字としては扱ってないやろ
バックスラッシュとnという2文字を渡された正規表現エンジンがそれを改行文字として扱う
それが正規表現のルール
>\nを改行の意味に変換したら加工しとるやろ
raw文字列は\nを改行文字としては扱ってないやろ
バックスラッシュとnという2文字を渡された正規表現エンジンがそれを改行文字として扱う
それが正規表現のルール
770デフォルトの名無しさん (ワッチョイ 22e7-odry)
2024/08/30(金) 02:17:10.13ID:+R5e+PNr0 そもそもrawデータというのは文字として決めつけて処理するものではなく、バイナリーデータとして扱って処理するものです。
771デフォルトの名無しさん (ワッチョイ 6e2a-EI2W)
2024/08/30(金) 07:42:30.12ID:FeMupkVu0 お前等hexで話せよ。分かりにくい。
6162 635c 6e abc\n
6162 630a abc.
6162 635c 6e abc\n
6162 630a abc.
772デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/30(金) 09:24:30.71ID:742oYIECa import re
s = r'abc\\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
s = r'abc\\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
773デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/30(金) 09:26:08.10ID:742oYIECa import re
s = r'abc\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
s = r'abc\n'
print(re.search('a(.+)\\n', s).groups()[0]) # !
print(re.search('a(.+)\n', s).groups()[0]) # !!!
774デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/30(金) 09:27:35.22ID:742oYIECa import re
s = r'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
s = r'abc\\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
775デフォルトの名無しさん (アウアウエー Sa0a-PBPb)
2024/08/30(金) 09:27:52.88ID:742oYIECa import re
s = r'abc\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
s = r'abc\n'
print(re.search(r'a(.+)\\n', s).groups()[0]) # !
print(re.search(r'a(.+)\n', s).groups()[0]) # !!!
776デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/31(土) 10:12:39.92ID:tZuU9Lep0 webページの取得をconcurrent.futuresで複数同時に回す
取得自体はseleniumで行う
毎回ログインするのを避ける為、ログイン済のdriverをmax_workers分用意する
そこまではいいとして、submitする時あるいはsubmit先で、
今どのdriverが使えるか判断しないといけない
自前でセマフォ作ってもいいけど、そんな管理もしてくれる何かがありそうな気がする
取得自体はseleniumで行う
毎回ログインするのを避ける為、ログイン済のdriverをmax_workers分用意する
そこまではいいとして、submitする時あるいはsubmit先で、
今どのdriverが使えるか判断しないといけない
自前でセマフォ作ってもいいけど、そんな管理もしてくれる何かがありそうな気がする
777デフォルトの名無しさん (ワッチョイ 82ad-aK75)
2024/08/31(土) 13:22:35.58ID:fwQH707u0 関数やクラスにインデックスの指す中身の値でなく“インデックス指定”を渡したいのですがうまく出来ません
こんな場合どういうような考え方があるのでしょう(タプルでインデックス数字を渡す?)
# [[0,0,0,0,0],[[0,0,0,0,0]]
alist = [[0]*5]*2
# 値ではなく箱の位置を意図してるが…
hako = alist[0][3]
def change(b):
b = 3
return
change(hako)
print(alist) # 全部0のまま
change(alist[0][4])
print(alist) # こちらも全部0
実際にはrpgゲームの様々のステートやフラグやそのセーブを管理するクラスに
alist[6][15](王さまと喋ったとか)を1にするといった仕事をさせたいと試行錯誤しています
喋る関数、戦う関数やクラスのとこから発生しだいリストを直で操作すればいいのだけど
State.change(インデックス, 1)みたく一元的にやりたいとクラスを作ってきています
目的で位置の固定されたフラグなのでメニューを開いているかState.menu(1)、State.kingtalked(1)などとしその先のクラスの関数で位置を決め撃ちするのが良いのかななどと困って考えています
こんな場合どういうような考え方があるのでしょう(タプルでインデックス数字を渡す?)
# [[0,0,0,0,0],[[0,0,0,0,0]]
alist = [[0]*5]*2
# 値ではなく箱の位置を意図してるが…
hako = alist[0][3]
def change(b):
b = 3
return
change(hako)
print(alist) # 全部0のまま
change(alist[0][4])
print(alist) # こちらも全部0
実際にはrpgゲームの様々のステートやフラグやそのセーブを管理するクラスに
alist[6][15](王さまと喋ったとか)を1にするといった仕事をさせたいと試行錯誤しています
喋る関数、戦う関数やクラスのとこから発生しだいリストを直で操作すればいいのだけど
State.change(インデックス, 1)みたく一元的にやりたいとクラスを作ってきています
目的で位置の固定されたフラグなのでメニューを開いているかState.menu(1)、State.kingtalked(1)などとしその先のクラスの関数で位置を決め撃ちするのが良いのかななどと困って考えています
778デフォルトの名無しさん (ワッチョイ 82ad-aK75)
2024/08/31(土) 13:25:10.84ID:fwQH707u0 しまった質問スレの存在を忘れてましたごめんなさい移動します>>3
779デフォルトの名無しさん (ワッチョイ 7901-vp4l)
2024/08/31(土) 14:06:22.04ID:o+gAgvj50780デフォルトの名無しさん (ワッチョイ 82ad-aK75)
2024/08/31(土) 14:44:18.13ID:fwQH707u0 >>779
最下段の文は無視してもらって
プログラム部分で
[[0,0,0,3,0][0,0,0,0,0]]
[[0,0,0,3,3][0,0,0,0,0]]なprint結果となる関数への渡し方や手法がしりたい
「書き換えたい多次元リストのインデックス」を関数などに渡しそこで処理する方法
書いてるうちに設計からおかしい気がしてきた
せっかくクラスを勉強してるので無理やりそこでまとめて(意味なく)処理したがってる
なにかあれば聞きたいけど質問は取り下げます
最下段の文は無視してもらって
プログラム部分で
[[0,0,0,3,0][0,0,0,0,0]]
[[0,0,0,3,3][0,0,0,0,0]]なprint結果となる関数への渡し方や手法がしりたい
「書き換えたい多次元リストのインデックス」を関数などに渡しそこで処理する方法
書いてるうちに設計からおかしい気がしてきた
せっかくクラスを勉強してるので無理やりそこでまとめて(意味なく)処理したがってる
なにかあれば聞きたいけど質問は取り下げます
781デフォルトの名無しさん (ワッチョイ 6ed6-VAad)
2024/08/31(土) 15:51:47.51ID:Ogc9sW700 無理なのでインデックスを渡すしかない
782デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/31(土) 16:07:04.72ID:tZuU9Lep0 インデックスといえば
l = [1, 2, 3]
l.index(2)
で1を得るけど、これの計算コストってどんなもんなんだろ
リストだけど固定なのが判ってたら、一旦逆引きのテーブルを作った方が有利なのか、
気にするほどでもないのか
l = [1, 2, 3]
l.index(2)
で1を得るけど、これの計算コストってどんなもんなんだろ
リストだけど固定なのが判ってたら、一旦逆引きのテーブルを作った方が有利なのか、
気にするほどでもないのか
783デフォルトの名無しさん (ワッチョイ 6ed6-VAad)
2024/08/31(土) 16:18:16.80ID:Ogc9sW700 https://github.com/python/cpython/blob/5332d989af45378e6ae99aeda72bfa82042b8659/Objects/listobject.c#L3181
ループするからO(n)かかる
それが問題になるならdictに突っ込むとかして高速化すればいい
ループするからO(n)かかる
それが問題になるならdictに突っ込むとかして高速化すればいい
784デフォルトの名無しさん (ワッチョイ 5d54-mV0m)
2024/08/31(土) 16:31:39.30ID:tZuU9Lep0 思ったより何も工夫してなかった
困ったら高速化しよう
まあ、困らないんだけど
困ったら高速化しよう
まあ、困らないんだけど
785デフォルトの名無しさん (ワッチョイ 8601-3oMX)
2024/08/31(土) 17:34:03.31ID:mruaKbs00 >>777
2次元で固定ならタプルで渡す
def modify(alist, indices, new_value):
alist[indices[0]][indices[1]] = new_value
任意の深さに対応したいならループさせる
(エラーになる状況が増えるので用途に合わせて対応が必要)
def modify(alist, indices, new_value):
element = alist
for i in indices[:-1]:
element = element[i]
element[indices[-1]] = new_value
あとalist = [[0]*5]*2 の初期化方法は要注意
alist[0][3] = 3とすると[[0, 0, 0, 3, 0], [0, 0, 0, 3, 0]]になるから
2次元で固定ならタプルで渡す
def modify(alist, indices, new_value):
alist[indices[0]][indices[1]] = new_value
任意の深さに対応したいならループさせる
(エラーになる状況が増えるので用途に合わせて対応が必要)
def modify(alist, indices, new_value):
element = alist
for i in indices[:-1]:
element = element[i]
element[indices[-1]] = new_value
あとalist = [[0]*5]*2 の初期化方法は要注意
alist[0][3] = 3とすると[[0, 0, 0, 3, 0], [0, 0, 0, 3, 0]]になるから
786デフォルトの名無しさん (ワッチョイ 82ad-aK75)
2024/08/31(土) 18:14:58.61ID:fwQH707u0 >>785
ありがとう!固定要素数じゃない場合の例が思案に明け暮れていたとこで、助かります!
丁度さっき、そうだ受け取ったstrに応じる形で"関数側のcase match文"で
決められた格納場所に同じく受け取ったvalueを書き込もう、としていました
コマンドウィンドウを開いているか否か0or1みたいなものを
StatsクラスのStats.write("commandopen", 1)、これの第一引数をcaseでふるいにかけ書き込むべきインデックスに辿り着く感じ…(>_<)
ありがとう!固定要素数じゃない場合の例が思案に明け暮れていたとこで、助かります!
丁度さっき、そうだ受け取ったstrに応じる形で"関数側のcase match文"で
決められた格納場所に同じく受け取ったvalueを書き込もう、としていました
コマンドウィンドウを開いているか否か0or1みたいなものを
StatsクラスのStats.write("commandopen", 1)、これの第一引数をcaseでふるいにかけ書き込むべきインデックスに辿り着く感じ…(>_<)
787デフォルトの名無しさん (ワッチョイ 8601-3oMX)
2024/08/31(土) 18:51:32.93ID:mruaKbs00 {“commandopen”: 1}がkey/valueなら
素直にdictionaryで状態管理したほうがいいんじゃないかな
case文やインデックス変換なくせるよ
素直にdictionaryで状態管理したほうがいいんじゃないかな
case文やインデックス変換なくせるよ
788デフォルトの名無しさん (ワッチョイ 82ad-aK75)
2024/08/31(土) 18:59:52.21ID:fwQH707u0 たしかに…辞書やjsonといった物の扱いに恐怖心があって無意識に避けてたかも
789デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/01(日) 08:53:52.90ID:5+RJ54+E0 前回と今回のid一覧があって、
今回追加分のidに該当するものがなければ終了
みたいな処理をどう書こうか考えてて、
結局setの演算にしたら1行になった
setむっさ使える
今回追加分のidに該当するものがなければ終了
みたいな処理をどう書こうか考えてて、
結局setの演算にしたら1行になった
setむっさ使える
790デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 14:46:18.35ID:V2ztMrfU0 テキストをフィルターしていて、
特定の行があったら、その前後の行も削除して出力したい
後ろも削除はiterでnext()すれば飛ばせるけど、
すでに出力しちゃったものを無かったことにするのが難しい
一旦全部バッファに溜めておくしか無いのかな
特定の行があったら、その前後の行も削除して出力したい
後ろも削除はiterでnext()すれば飛ばせるけど、
すでに出力しちゃったものを無かったことにするのが難しい
一旦全部バッファに溜めておくしか無いのかな
791デフォルトの名無しさん (ワッチョイ 479f-7hP0)
2024/09/02(月) 16:47:53.26ID:ciLmvDW/0 全部じゃなく
1行バッファして次が来たら出力する部品でいいんでは?
もちろんバッファ削除とフラッシュの機能もつける
1行バッファして次が来たら出力する部品でいいんでは?
もちろんバッファ削除とフラッシュの機能もつける
792デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 17:05:31.51ID:V2ztMrfU0 削除する必要が最大1行ならいいけど、実際には2行のケースもある
793デフォルトの名無しさん (ワッチョイ 479f-7hP0)
2024/09/02(月) 17:13:39.22ID:ciLmvDW/0 理解力というか応用力低すぎて草
794デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 17:30:55.08ID:V2ztMrfU0 んー、そんな小手先で回避してたらすぐ行き詰まるよ
795デフォルトの名無しさん (ワッチョイ 5f6e-a21C)
2024/09/02(月) 17:52:44.67ID:DywOJmSg0 1回目は削除インデックスを確保するだけで2回目のフィルタリングでそのインデックスを削除する
何行削除でも可能
何行削除でも可能
796デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 18:08:44.35ID:V2ztMrfU0 なるほど2パスにするのか
入力はファイルなのでそれで十分だし高速だしメモリも食わない
ストリームにまで対応可能な方法は多分ない
入力はファイルなのでそれで十分だし高速だしメモリも食わない
ストリームにまで対応可能な方法は多分ない
797デフォルトの名無しさん (ワッチョイ 072a-DKuy)
2024/09/02(月) 18:18:02.18ID:cZu9PahF0 >>790
俺にはこの話題の sed コマンドは全く理解できないが、解るなら python に移植してみてはどうだ。
https://mevius.5ch.net/test/read.cgi/unix/1085730992/593-
俺にはこの話題の sed コマンドは全く理解できないが、解るなら python に移植してみてはどうだ。
https://mevius.5ch.net/test/read.cgi/unix/1085730992/593-
798デフォルトの名無しさん (ワッチョイ 5f86-NFJX)
2024/09/02(月) 18:18:35.06ID:0P3ClJWr0 dpでやるやつじゃね?
799デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 18:24:28.25ID:V2ztMrfU0 sed的にやろうとすると、ファイル全体を読み込んで検索して、というやり方と同じなので、
メモリはファイルサイズだけ食うことになる
sedはそれをストリームに対してやるのでメモリ食わない
メモリ節約するなら最低限だけ読みながら、という処理になるけど、
最低限が何行なのかは条件次第なので条件の解析までやらないといけなくて、
ツブシの効かないコードを頑張って書くことになる
メモリはファイルサイズだけ食うことになる
sedはそれをストリームに対してやるのでメモリ食わない
メモリ節約するなら最低限だけ読みながら、という処理になるけど、
最低限が何行なのかは条件次第なので条件の解析までやらないといけなくて、
ツブシの効かないコードを頑張って書くことになる
800デフォルトの名無しさん (ワッチョイ 479f-7hP0)
2024/09/02(月) 18:39:20.59ID:ciLmvDW/0 主に最適化の理由で出力のバッファリングはPython内外で透過的に行われてるし
そこに出力遅延するio.Writer追加するだけの話
バッファはいくらでも動的に確保したらいい
小手先らしいけどそれで必要十分
そこに出力遅延するio.Writer追加するだけの話
バッファはいくらでも動的に確保したらいい
小手先らしいけどそれで必要十分
801デフォルトの名無しさん (ワッチョイ df31-XDF5)
2024/09/02(月) 18:49:11.43ID:R3lh7LPd0 本人がバッファリングが必要な範囲を抽象化して捉えられてないから1行とか2行とかって説明になるんだろ
最近出現頻度の高い末尾54さんはいつもこのパターン
最近出現頻度の高い末尾54さんはいつもこのパターン
802デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/02(月) 18:53:10.49ID:V2ztMrfU0 前後の行としか書いてないけどな
前後n行だよ
バッファリングするのはいいとして、フラッシュのタイミングが不明だとどうしようもない
前後n行に絶対引っかからない行が定義できない
前後n行だよ
バッファリングするのはいいとして、フラッシュのタイミングが不明だとどうしようもない
前後n行に絶対引っかからない行が定義できない
803デフォルトの名無しさん (ワッチョイ 5f6e-a21C)
2024/09/02(月) 18:56:45.68ID:DywOJmSg0 前の全部の行が削除対象になり得ることを考えるとストリームにやるなら全部バッファに溜めるしかなさそうだ
804デフォルトの名無しさん (ワッチョイ ff7c-rxv+)
2024/09/03(火) 15:35:20.10ID:GbfXXZxt0805デフォルトの名無しさん (ワッチョイ 5f4d-XDF5)
2024/09/03(火) 21:07:40.33ID:l2RoLSBv0 N行が全行−1行になることもあるから1パスだとメモリ食ってヤダって話みたいよ
そもそもの問題認識が間違ってるよね
そもそもの問題認識が間違ってるよね
806デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/03(火) 21:28:25.04ID:b8qS9knc0 今やメモリなんて膨大にあるから、1億行でも平気
そんなこと気にしないのが簡単でかつ現実的
一応気にして2パスにするのも、比較的簡単
中途半端に気にして対応すると手間がかかる上に不完全になる
そんなこと気にしないのが簡単でかつ現実的
一応気にして2パスにするのも、比較的簡単
中途半端に気にして対応すると手間がかかる上に不完全になる
807デフォルトの名無しさん (ワッチョイ 5f5c-1cCN)
2024/09/03(火) 22:33:39.88ID:2uJG6i7Z0 じゃあ何を悩んでたの?
よく分かんねーけど能書きの前に常識として謝辞のひとことくらい述べたらどうかね
よく分かんねーけど能書きの前に常識として謝辞のひとことくらい述べたらどうかね
808デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/03(火) 22:36:18.67ID:b8qS9knc0 なんか知らんけど、勉強する気のない奴が紛れ込んでるんだよな
809デフォルトの名無しさん (ワッチョイ e768-3eZc)
2024/09/04(水) 10:07:28.75ID:1egc59UO0 slenium使ってWebページの巡回してますが、CSSセレクターやxpathが日によって変動する場合の対処法をご教授願えれば幸いに存じ上げマッスルマッスル。
810デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 13:21:36.89ID:8f/9E+Y70 フルで指定しなくても部分でもいけるので、変わらない部分を使う
811デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 16:46:15.23ID:8f/9E+Y70 またストリームっぽい話
デリミタ行があって、それで区切った単位で処理する
デリミタを見つけたら処理、みたいにすると、デリミタ無しで終了した場合に最後が抜ける
元データの方で最後にもデリミタを入れる
ループを抜けた後に同じ処理を追加する
デリミタ or EOF みたいな判定にする
等の対応があって、EOFがスマートそう
でもEOFの検出が大変
ファイルを1行ずつ読んでても次を読んでみないと判らないし、
iterでも例外を起こすとか、リストが対象だったらコピーしといてpopしていって空か見るとか
最後まで行ったら自動で終わる処理はとても書きやすいのに、
最後の処理の最中に最後だと判定するのが困難
デリミタ行があって、それで区切った単位で処理する
デリミタを見つけたら処理、みたいにすると、デリミタ無しで終了した場合に最後が抜ける
元データの方で最後にもデリミタを入れる
ループを抜けた後に同じ処理を追加する
デリミタ or EOF みたいな判定にする
等の対応があって、EOFがスマートそう
でもEOFの検出が大変
ファイルを1行ずつ読んでても次を読んでみないと判らないし、
iterでも例外を起こすとか、リストが対象だったらコピーしといてpopしていって空か見るとか
最後まで行ったら自動で終わる処理はとても書きやすいのに、
最後の処理の最中に最後だと判定するのが困難
812デフォルトの名無しさん (ワッチョイ 5f4d-JZrR)
2024/09/04(水) 16:53:37.40ID:mtP1OC380 日本語を見ればプログラミング適性がないのがよくわかる
813デフォルトの名無しさん (ワッチョイ 479f-7hP0)
2024/09/04(水) 17:15:00.32ID:u5L50CbY0 デリミタ行以外で終端になったら
追加でデリミタ行を返すイテレータを書くだけ
追加でデリミタ行を返すイテレータを書くだけ
814デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 17:24:08.15ID:8f/9E+Y70 データ数nでデリミタ数n-1、という気持ち悪い状態が自然によくあるんだよな
joinで結合して、splitで分解するのと同様に、
デリミタで分解する処理を最初に入れるのが多分正解
最後のデリミタがあってもなくてもいいようにしないといけない
joinで結合して、splitで分解するのと同様に、
デリミタで分解する処理を最初に入れるのが多分正解
最後のデリミタがあってもなくてもいいようにしないといけない
815デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 17:28:38.80ID:8f/9E+Y70 分解する処理が全く同じ問題にぶつかるんですが
816デフォルトの名無しさん (ワッチョイ 87a9-vKF2)
2024/09/04(水) 17:30:47.74ID:6BJD9ak60817デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 17:33:35.02ID:8f/9E+Y70 perlだったら、f = open(file) みたいなので取得したファイルオブジェクトに対して
eof(f) を見たら終端に達してるかどうかが判る
pythonでもf.eof() みたいなのを作っといてくれればいいのに無いというのは、
そんなプログラムは書くなという明示的な意図なんだろうな
便利なのになー
なんで駄目なんだろ
eof(f) を見たら終端に達してるかどうかが判る
pythonでもf.eof() みたいなのを作っといてくれればいいのに無いというのは、
そんなプログラムは書くなという明示的な意図なんだろうな
便利なのになー
なんで駄目なんだろ
818デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 17:54:41.94ID:8f/9E+Y70 仕方ないからsplitのlist版を汎用で書いて、自分用ライブラリに入れとこう
これも意地悪で存在しないのか?
これも意地悪で存在しないのか?
819デフォルトの名無しさん (ワッチョイ 479f-7hP0)
2024/09/04(水) 18:09:05.10ID:u5L50CbY0 more_itertools.split_ナントカ
820デフォルトの名無しさん (ワッチョイ ff7c-rxv+)
2024/09/04(水) 19:07:28.42ID:8eJhy0Tz0 >>0811
1行単位で読みつつ複数行単位で処理したいループのあるあるだね
Pythonならイテレータやジェネレータを使うかも
https://ideone.com/qSuDAt
なるほどジェネレータの処理が“全く同じ問題にぶつか”ってて、
この例ではそこを「ループを抜けた後に同じ処理を追加する」でやってることになるかな
まあでも、泥臭いことをここに押し付けて、メインのループがブロック単位でまわせるのがよい
だいたい、ふだん行単位でまわせるのもライブラリが泥臭いことしてるおかげだし
1行単位で読みつつ複数行単位で処理したいループのあるあるだね
Pythonならイテレータやジェネレータを使うかも
https://ideone.com/qSuDAt
なるほどジェネレータの処理が“全く同じ問題にぶつか”ってて、
この例ではそこを「ループを抜けた後に同じ処理を追加する」でやってることになるかな
まあでも、泥臭いことをここに押し付けて、メインのループがブロック単位でまわせるのがよい
だいたい、ふだん行単位でまわせるのもライブラリが泥臭いことしてるおかげだし
821デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 19:46:26.52ID:8f/9E+Y70822デフォルトの名無しさん (スプッッ Sdff-UdSI)
2024/09/04(水) 20:41:57.33ID:gNKcgXFOd こういうバカに産まれなくてホントに良かったよ
CSVなんかでも最後にカンマあるとかねーとかでうんうん言うんかな
CSVなんかでも最後にカンマあるとかねーとかでうんうん言うんかな
823デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/04(水) 20:59:08.55ID:8f/9E+Y70 セパレータで区切って1行になってたら最後にはセパレータがあってほしくない
文字列を改行で区切って並べるなら、最後にも改行があって欲しい
等価なことをやってる筈なのに、区切りが改行の時だけ例外なんだよな
'\n'.join(l) + '\n'
みたいなことをやる羽目になって、それが正しいんだけど不便
文字列を改行で区切って並べるなら、最後にも改行があって欲しい
等価なことをやってる筈なのに、区切りが改行の時だけ例外なんだよな
'\n'.join(l) + '\n'
みたいなことをやる羽目になって、それが正しいんだけど不便
824デフォルトの名無しさん (ワッチョイ 7f34-lL3G)
2024/09/05(木) 00:04:43.15ID:J+Hr7uF60 汚れ仕事になると分かってるなら
そこだけ分離するな
そこだけ分離するな
825デフォルトの名無しさん (アウアウエー Sa1f-XN8b)
2024/09/05(木) 00:12:14.06ID:/oUqYYg3a >>811
readerにfinalizeを用意させれば良い
readerにfinalizeを用意させれば良い
826デフォルトの名無しさん (アウアウエー Sa1f-XN8b)
2024/09/05(木) 00:14:42.60ID:/oUqYYg3a >>822
range(start, end) で end - 1 までになるのが納得いかないとか言い出しそうだよね
range(start, end) で end - 1 までになるのが納得いかないとか言い出しそうだよね
827デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/05(木) 12:37:32.12ID:yOHjemdL0 これが汚れ仕事になってしまうのは、プログラム的な正しさと人間の正しさの感覚の齟齬があるんだろうな
pascalで行末にセミコロンを付ける
でもこれはセパレータなので、最後の行にも付けるとエラーにされる
ふざけんなということで、Cではセパレータではなく行末記号になった
今度は最後にも付けないとエラー
a = [
aaa,
bbb,
ccc,
]
最後のコンマは要らないけど、あった方が書きやすいし、勝手にヌル要素が追加されたりもしない
無視されるだけ
a = func(a, b, c,)
これも許容される
でも気持ち悪いから、多分こうは書かない
最後の余分なセパレータに対する統一的な方針は無い
pascalで行末にセミコロンを付ける
でもこれはセパレータなので、最後の行にも付けるとエラーにされる
ふざけんなということで、Cではセパレータではなく行末記号になった
今度は最後にも付けないとエラー
a = [
aaa,
bbb,
ccc,
]
最後のコンマは要らないけど、あった方が書きやすいし、勝手にヌル要素が追加されたりもしない
無視されるだけ
a = func(a, b, c,)
これも許容される
でも気持ち悪いから、多分こうは書かない
最後の余分なセパレータに対する統一的な方針は無い
828デフォルトの名無しさん (ワッチョイ ff7c-rxv+)
2024/09/05(木) 13:31:44.17ID:Uxm0hRsL0 >>0823
「最後にもセパレータがある」は矛盾してるよ
最後のセパレータの次には空の要素があるとみなすべき
それぞれの要素の後に記号をつける場合その記号は「ターミネータ」
記号は改行だけとは限らず「foo;bar;baz;」とかでもよい
ターミネータ式では「foo;bar;baz」は厳密には ["foo", "bar"] にゴミがついてるとみなすけど、最後の要素とみなすことも多い。それでも「foo;bar;」で最後に空の要素があるとはみなさないのでセパレータとは違う
splitやjoinはセパレータ式を扱うものだから、ターミネータ式の分割と結合に使うとき小細工が必要なのは仕方ない
>>0823 の「等価な筈なのに〜」だの「セパレータが改行のときだけ」だのも区別がついてない
「ターミネータの場合は」なの
# セパレータをカンマからタブに
csv = "foo,bar,baz"
list = csv.split(",")
tsv = "\t".join(list)
# ターミネータをセミコロンから改行に
stv = "foo;bar;baz;"
list = stv.split(";")[:-1] # 小細工
ltv = "\n".join(ltv) + "\n" # 小細工
「最後にもセパレータがある」は矛盾してるよ
最後のセパレータの次には空の要素があるとみなすべき
それぞれの要素の後に記号をつける場合その記号は「ターミネータ」
記号は改行だけとは限らず「foo;bar;baz;」とかでもよい
ターミネータ式では「foo;bar;baz」は厳密には ["foo", "bar"] にゴミがついてるとみなすけど、最後の要素とみなすことも多い。それでも「foo;bar;」で最後に空の要素があるとはみなさないのでセパレータとは違う
splitやjoinはセパレータ式を扱うものだから、ターミネータ式の分割と結合に使うとき小細工が必要なのは仕方ない
>>0823 の「等価な筈なのに〜」だの「セパレータが改行のときだけ」だのも区別がついてない
「ターミネータの場合は」なの
# セパレータをカンマからタブに
csv = "foo,bar,baz"
list = csv.split(",")
tsv = "\t".join(list)
# ターミネータをセミコロンから改行に
stv = "foo;bar;baz;"
list = stv.split(";")[:-1] # 小細工
ltv = "\n".join(ltv) + "\n" # 小細工
829デフォルトの名無しさん (ワッチョイ 7f34-lL3G)
2024/09/05(木) 14:35:40.58ID:J+Hr7uF60 セパレータなのか終端記号なのかというところに
統一的な見解を作るのは無理だろう
統一的な見解を作るのは無理だろう
830デフォルトの名無しさん (ワッチョイ 2701-Ve+T)
2024/09/05(木) 15:30:26.64ID:gQmEldZ20831デフォルトの名無しさん (アウアウエー Sa1f-XN8b)
2024/09/05(木) 23:28:48.64ID:/+8Jbbe1a832デフォルトの名無しさん (ワッチョイ 5f5c-1cCN)
2024/09/05(木) 23:37:18.89ID:mXpnohHX0 それ終端なのかよURIの記法ってそうだっけパスの頭じゃねーの?
833デフォルトの名無しさん (ワッチョイ 6754-DWku)
2024/09/05(木) 23:37:57.01ID:yOHjemdL0 urlもそうだし、パスを分解する時も、なんだこの不規則はと悩む
C:/
は/が無いと意味不明になる
でも
C:/bin/
C:/bin
はどっちもあり
ファイルとディレクトリを同列に扱いたいというスタンスからすると、末尾の/はあって欲しくない
でもルートの場合は必要
どっちかに統一しないと、
f'{path}/{filename}'
みたいに書けない
仕方ないので、あってもなくてもいいけど、あったら無視する
という汚れ仕事吸収層に任せることに
C:/
は/が無いと意味不明になる
でも
C:/bin/
C:/bin
はどっちもあり
ファイルとディレクトリを同列に扱いたいというスタンスからすると、末尾の/はあって欲しくない
でもルートの場合は必要
どっちかに統一しないと、
f'{path}/{filename}'
みたいに書けない
仕方ないので、あってもなくてもいいけど、あったら無視する
という汚れ仕事吸収層に任せることに
834デフォルトの名無しさん (ワッチョイ 8779-55Je)
2024/09/06(金) 00:52:19.42ID:0I3gstue0 urlといいうか、*nixはスラッシュ止が本来なんだっけ?
それにしてもファイルパスは意外と厄介
rsyncみたいに、スラッシュがあるかないかで振る舞いが全く異なるものもあるし
それにしてもファイルパスは意外と厄介
rsyncみたいに、スラッシュがあるかないかで振る舞いが全く異なるものもあるし
835デフォルトの名無しさん (ワッチョイ 5f56-q2Ob)
2024/09/06(金) 00:54:13.81ID:R0hAYngZ0 最初の/は、ルートではなく絶対パスの意味
長さゼロの文字列はカレントディレクトリかなぁ
ドライブ指定のみ
C:
ドライブ指定+絶対パス指定
C:/
ドライブ指定+相対パス指定
C:.
C:/Users>cd /d D:/
D:/>cd /d C:.///.//yamada///Music//
C:/Users/yamada/Music>
となるし
長さゼロの文字列はカレントディレクトリかなぁ
ドライブ指定のみ
C:
ドライブ指定+絶対パス指定
C:/
ドライブ指定+相対パス指定
C:.
C:/Users>cd /d D:/
D:/>cd /d C:.///.//yamada///Music//
C:/Users/yamada/Music>
となるし
836デフォルトの名無しさん (オイコラミネオ MMcb-rxv+)
2024/09/06(金) 08:29:25.15ID:FtlRyc/CM >>830
820 と 828 にツッコミありがと そのとおりだね
いずれにせよ811や823の参考になればと思ったけれど
833までみるとプログラミングやPythonの勉強よりは別のことをしたいみたいだ
820 と 828 にツッコミありがと そのとおりだね
いずれにせよ811や823の参考になればと思ったけれど
833までみるとプログラミングやPythonの勉強よりは別のことをしたいみたいだ
837デフォルトの名無しさん (スププ Sd7f-8MDM)
2024/09/06(金) 12:59:23.01ID:5V/vqJZed もうメンテナンスしかやることねえ・・
838デフォルトの名無しさん (ワッチョイ 0701-F2Kr)
2024/09/06(金) 13:05:03.70ID:8mJhneNM0839デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 15:15:22.20ID:kb80ato/0 ほぼ知識ゼロの状態からPythonでアプリを作るのは無謀?
840デフォルトの名無しさん (ワッチョイ 7f34-lL3G)
2024/09/06(金) 16:28:40.66ID:b7WWclpu0 知識ゼロにも色々あってな
プログラミング自体やったことがないのか
Pythonでやったことがないだけなのか
プログラミング自体やったことがないのか
Pythonでやったことがないだけなのか
841デフォルトの名無しさん (スッップ Sd7f-CFO5)
2024/09/06(金) 16:35:05.78ID:e4ITOx4xd PC触ったことないとか
842デフォルトの名無しさん (ワッチョイ 5f87-F2Kr)
2024/09/06(金) 16:43:13.12ID:QtgCCsYf0843デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 16:43:15.17ID:kb80ato/0 プログラミングの知識はほぼゼロ
unreal engineのC++に何が書いてあるのかわからない
コードの書き方の知識もほぼゼロ
unreal engineのC++に何が書いてあるのかわからない
コードの書き方の知識もほぼゼロ
844デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 16:44:13.37ID:kb80ato/0 >>842
良い書籍や動画を教えてくれると助かる
良い書籍や動画を教えてくれると助かる
845デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 16:47:34.80ID:kb80ato/0 組みたいプログラムはオレの知る限り、おそらく一般には採用されてないけど、そんなに複雑なものでもないと思う
なので、信頼してる人しか組みたいプログラムは教えたくない
なので、信頼してる人しか組みたいプログラムは教えたくない
846デフォルトの名無しさん (スッップ Sd7f-CFO5)
2024/09/06(金) 16:52:45.07ID:e4ITOx4xd847デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 16:56:57.72ID:kb80ato/0848デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 16:58:56.36ID:kb80ato/0 >>846
どのリストから見れば良い?w
どのリストから見れば良い?w
849デフォルトの名無しさん (ワッチョイ 278b-k4Tl)
2024/09/06(金) 17:01:38.70ID:kb80ato/0 UE使う時にvisual studio入れた
サッパリだったけど…
サッパリだったけど…
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 「おこめ券は米以外の食品も買える。効果的な活用を」 地元で農水相 [山形県] [少考さん★]
- 【速報】「女芸人No.1決定戦 THE W」9代目女王にニッチェ! 7年ぶり3度目で悲願の優勝 [牛丼★]
- 【芸能】『女芸人No.1決定戦THE W』 粗品が最後にバッサリ「優勝賞金1000万円にしてはレベル低い大会」 [冬月記者★]
- 【🐻ニャー】京都府向日市の「クマ目撃情報」は見間違いか 市が映像確認「ネコに似ていた」 [nita★]
- 今年の流行語大賞 『働いて働いて働いてまいります』が受賞で不快感… 過労自殺の遺族らが会見「家族にむち打つような行為だ」 [冬月記者★]
- 【東京】「家族で話題にして」 “世田谷一家殺害から25年 警視庁が呼びかけ [煮卵★]
