Pythonのお勉強 Part70

■ このスレッドは過去ログ倉庫に格納されています
2023/03/04(土) 00:18:00.31ID:dUl31UkL0
↑スレ立てる毎に減るので、減ってたら3つに補充すること。

・当スレにRubyのソースコード類を書くことを禁ず
・Ruby等、Pythonではないプログラミング言語での回答類・質問を書くのも禁止
・「Ruby では」「Rubyでは」「Rails」正規表現→「^クソチョンw$」をNGワード登録推奨
・エラーを解決したいときは、かならず
 エラー文(勝手に省略orスクショうp等の横着禁止)と
 おま環(Pythonのバージョン番号+OS名とバージョン+IDE名)を書け。

★Pythonのソースコードを5ちゃんに直貼はインデントが崩壊するので、
  ↓等のコードうp用サイトに貼ってきてくだしあ。(スクリーンショットをうpる「横着」禁止)
ttps://techiedelight.com/compiler/  Run Code機能あり。
ttp://ideone.com/      デフォ設定がCなので、Pythonするには言語種選択ボタン押下がピコ手間かも。
ttp://pastebin.com/     まずまずシンプル。
ttp://dpaste.com/      とてもシンプル。消えるまでの日数は十分長ーく指定のこと。

◇Pythonオフィシャルサイト http://www.python.org/
◇Pythonドキュメント https://docs.python.org/ja/3/
◇まとめwiki ttp://python.rdy.jp/
VIPQ2_EXTDAT: default:vvvvv:1000:512:: EXT was configured
2023/04/15(土) 11:53:29.81ID:iK0tlqDR0
>>146
リスト内包表記を
> numpyに合わせ
るというのはどうするんでしょうか?
whereとかmaskで書く
2023/04/15(土) 15:09:11.60ID:sKf60sYO0
>>148
awaitに書き直すのが一番スッキリすると思うけど書き直すのが面倒ならcondvar
151Jun (ワッチョイ 7fda-F1k0)
垢版 |
2023/04/16(日) 01:28:24.77ID:Lsji3jpm0?2BP(0)

PythonでPyGameを使ってゲームが作れるようになりたいです。
152Jun (ワッチョイ 7fda-F1k0)
垢版 |
2023/04/16(日) 01:49:57.68ID:Lsji3jpm0?2BP(0)

Pythonのソースコードをすらすら書けるようになるには、どうしたらいいですか?
153デフォルトの名無しさん (ワッチョイ 8736-Jl7Z)
垢版 |
2023/04/16(日) 22:36:43.99ID:2LWEnpk00
dictionary型ってどういうときに使うの?
全然ありがたみがわからない
2023/04/16(日) 23:07:46.43ID:zYleX6N80
適材適所だから配列だけで困ってないなら知らなくてもいい
配列の探索はみつかるまで最悪全要素しらべる必要があるけど
辞書のキーは比較的短時間で探せる構造になってたりはする
155デフォルトの名無しさん (ワッチョイ 7f33-S3w6)
垢版 |
2023/04/16(日) 23:12:03.98ID:KBeSrEQR0
dict型とdictionary型は違うからな
2023/04/16(日) 23:28:39.97ID:calMfenH
WebアプリのAPIでクエリとかレスポンス返すときにJSONで扱いたいときかなぁ
json.dumps/loadsであんまり意識しなくてよくなる

import json
json_str = '{"a":10,"b":20,"c":true,"d":null}'
d = json.loads(json_str)
print(type(d),d)
json_str = json.dumps(d)
print(type(json_str), json_str)
#<class 'dict'> {'a': 10, 'b': 20, 'c': True, 'd': None}
#<class 'str'> {"a": 10, "b": 20, "c": true, "d": null}

あとは引数に展開するときとか?
def deco(a,b=0,*args,**kwrgs):
 print(a,b)
 print(args)
 print(kwrgs)
a=1
b=2
args=[3,4,5]
kwrgs={"x":11,"y":22}
deco(a,b,*args,**kwrgs)
#1 2
#(3, 4, 5)
#{'x': 11, 'y': 22}
2023/04/17(月) 00:52:15.92ID:n1XKDS030
googleアカウントとか python じゃないけど辞書型だよ
メールアドレスをキーにしてバリューはそのアカウントの情報
配列よりも高速にアクセスできるし
重複チェックも容易
2023/04/17(月) 13:29:10.71ID:4hNaPs7ta
Ruby では、辞書はHash

require 'json'

# JSON では、nil ではなく、null を使う
json_str = '{"a":1,"b":"bb","c":true,"d":null}'
puts json_str #=> {"a":1,"b":"bb","c":true,"d":null}

p json_obj = JSON.parse( json_str )
#=> {"a"=>1, "b"=>"bb", "c"=>true, "d"=>nil} # nil になる

p json_obj.class #=> Hash

puts JSON.dump( json_obj )
#=> {"a":1,"b":"bb","c":true,"d":null} # null になる
2023/04/17(月) 16:06:07.88ID:kmcXsww3a
>>158
Rubyは欠陥言語
# https://ideone.com/cpA5lk
require 'json'
json_obj = {:a=>1, :b=>"bb", :c=>true, :d=>nil, "b"=>"BB"}
p json_obj.class #=> Hash
json_str = JSON.dump(json_obj)
puts json_str #=> {"a":1,"b":"bb","c":true,"d":null,"b":"BB"}
puts JSON.parse(json_str) #=> {"a"=>1, "b"=>"BB", "c"=>true, "d"=>nil}
160デフォルトの名無しさん (アウアウウー Sacb-Naft)
垢版 |
2023/04/18(火) 15:41:29.64ID:sxhvE7iUa
白目!
2023/04/18(火) 20:29:38.91ID:OYqyJGa8a
元々、JSON では、:b みたいなシンボルは使えない。ParserError。
"b" みたいな文字列しか使えない

require 'json'

json_str = '{:b=>"bb"}'
puts json_str #=> {:b=>"bb"}

p json_obj = JSON.parse( json_str )
#=> JSON::ParserError
2023/04/18(火) 20:54:35.49ID:OYqyJGa8a
元々、JavaScript でも、同じプロパティが上書きされるだけ

const json_str = '{"b":"bb","b":"BB"}';
const json_obj = JSON.parse( json_str );

console.log( json_obj );
//=> Object { b: "BB" } 1つになる!
2023/04/19(水) 03:05:38.54ID:ZTiW0i9K0
そもそもアカウント管理はLDAP使うんじゃないのか?
プログラムレベルの処理になるとメモリ上でディクショナリ使うかもしれないが
2023/04/19(水) 11:55:51.92ID:J7SITOSf0
インデックスが同じ DataFrame df と Series s があり、全ての要素は float であるとする。
df の各行について s の対応する行の要素より大きい要素が一つでもあるかどうか調べたいんだが、どうしたら良い?
df > s で True/False が格納された DataFrame が返ることを期待していたが、「automatic reindexing は推奨されない」と言われてすべて NaN の DataFrame が返された。
2023/04/19(水) 13:52:15.60ID:HyPlOTI2
pathlibでイテレーティブルに操作できるようなライブラリ作ろうとしたけどめんどくさくて断念
例えば
ディレクトリ構成
data
├a
├b
└c
dataディレクトリを指定して、子ディレクトリに対して操作する場合
pathlibを拡張したクラス=PathEXとして
PathEX(data_dir_path).find_dir(pattern).delete_files_with_chars(characters)
(pattern=aとcディレクトリだけ見つける)
みたいなことをやりたい場合

イテレーティブルな操作だと
「aの中のcaractersを含むファイル1を削除、aの中のcaractersを含むファイル2を削除、、、cの中のcaractersを含むファイル1を削除、、、、」
みたいなのが理想だけど
その前にdirかどうかをスルーする操作やpatternのdirかどうかを判別しないといけないので
イテレーションであるメリットが少ないような・・

なのでfind_dirの段階でイテレーションを再帰して、patternだけのパスをリストに格納
そのリストからfileだけを検索(イテレーションを再帰して→ファイルだけのパスをリストに格納)
そのリストからdelete_files_with_chars(characters)
みたいに、目的のファイルやディレクトリのパスだけをflattenにして
その確定したリストに対して操作する方が良いような気がしてきた
これが何万ファイルとかになってくると違いがあるのかはわからないけど。
明らかにpathlibオブジェクト数の分だけメモリ溜まっていきそうなので

ただこれなら.find_dir(pattern).find(pattern).ignor(pattern)みたいにいくらpatternを追加しても
pattern毎に再帰は増えるけどシンプルに操作できる
今のところこれで困ってないしエラー処理が簡単なのでいいけど、無駄は多そう
2023/04/19(水) 14:26:56.97ID:r24Gen790
整数がいくつか入力されて、最終的に0からmaxまで揃ってるかどうか調べたい
exists[num] = True
みたいなことをすると、エラーになるので、どうやって回避したもんか
2023/04/19(水) 14:59:59.68ID:NBiOUl/V0
>>166
ソートして舐めるのは駄目なん?
最終的に整数列が欲しいだけなら0からmaxの数列生成してからシャッフルした方が楽かも
2023/04/19(水) 15:12:22.49
>>166
max = 3
d = {}
while True:
 print(d)
 i = int(input(f"{max}までの正の整数を入力してください。"))
 if i > 0 and i <= max:
  d[i] = i
 if len(set(list(d))) == max:
  break
print("終了")
print(d)

{}
3までの正の整数を入力してください。0
{}
3までの正の整数を入力してください。2
{2: 2}
3までの正の整数を入力してください。4
{2: 2}
3までの正の整数を入力してください。1
{2: 2, 1: 1}
3までの正の整数を入力してください。3
終了
{2: 2, 1: 1, 3: 3}
2023/04/19(水) 15:22:18.37ID:r24Gen790
何を入れてもいい箱は辞書か集合だよな
なんかキーが数というのに抵抗がある
dic{1.1} = True
とかちゃんと動くの?
2023/04/19(水) 15:22:52.39ID:r24Gen790
[1.1]
2023/04/19(水) 15:33:37.73
google colaboratoryのpython3.9はいけた
d = {}
d[0.05]=True
d[1.1]=True
d[1.2]=True
d[2.0]=True
print(d)
print(len(d))
#{0.05: True, 1.1: True, 1.2: True, 2.0: True}
#4
len(d)だけでいけた >168
2023/04/19(水) 15:54:16.31ID:r24Gen790
d = {}
d[1] = True
print(d[0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1]) # KeyError: 0.9999999999999999

こんなのはやっぱり動かない
2023/04/19(水) 16:00:04.24
何がしたいのかはわからんけど
普通にエラー吐けばいいだけの話では
2023/04/19(水) 16:00:53.93ID:VKTpm4xNd
要素数max+1個のlistを使えよ
2023/04/19(水) 16:04:43.65
>exists[num] = True
この辺の謎縛りがなけりゃ普通にリストとappend使ってif inで重複調べるだけでいけそう
2023/04/19(水) 16:34:20.46ID:V36h4z9V0
>>164
不等号の代わりにDataFrameのgtとかltを使う
2023/04/19(水) 16:40:40.19ID:V36h4z9V0
>>165
イテラブルとイテレーティブという言葉はあるけどイテレーティブルという言葉はないぞ
んでもって変なライブラリ作らなくてもPath.globでイテレーティブに操作できる

メソッドチェーン化したいという理由があるのかもしれないけど
それはPythonのやり方ではないので自分しか読まないようなコード以外では避けたほうがいい
汎用化したい場合はdata_dir_path, pattern, charactersを受け取るような関数を作る
中身はforループ
178デフォルトの名無しさん (ワッチョイ 7f12-bLn0)
垢版 |
2023/04/19(水) 17:10:02.05ID:1S6lpC/v0
pythonでmxnetをインポートしようとすると出てくるエラーに関する質問です。
(私の使用している環境は以下の通りです。
python: 3.10.8, mxnet: 1.8.0, windows: 10.0.19044.2728
CPU: intel core i7, GPUはありません。)

import mxnet を実行すると、

Could not find module
'C:\Users\ \AppData\Local\Programs\Python\Python310\lib\site-packages\mxnet\libmxnet.dll' (or one of its dependencies).
Try using the full path with constructor syntax.

というエラーが出現します。
調べると、どうもlibmxnetのpathに関する問題らしいのですが、
具体的な解決方法がわかりません。
具体的にどんなコードを実行したらエラーが直るか、教えていただけないでしょうか?

あるいはGPUが必要なのでしょうか?
2023/04/19(水) 17:23:53.73ID:V36h4z9V0
>>166
入力値がリストで0からmaxまでの整数値なのであればsetにして長さを比較
マイナス値やmaxを超えた整数値が存在する可能性があるのであればmax+1の長さの配列を用意して比較

def check(input_list):
__xs = [False] * (_max + 1)
__for i in input_list:
____try:
______xs[i] = True
____except IndexError:
______return False

__return all(xs)
2023/04/19(水) 17:35:15.56ID:r24Gen790
maxはgivenではなくて入力された中の最大値
2023/04/19(水) 17:51:09.87ID:+idC8n5I0
>>176
gt, lt に axis 指定で望みの動作になりました!
ありがとうございます!
2023/04/19(水) 17:57:15.31ID:HyPlOTI2
>>177
>Path.globで
やってみるとわかるがこれだと結局、目的のパスが静的に決定している場合のみの逐次処理にしないといけないので
PathEXを作る意味はない
もちろんそういう場合にはpathlibだけで事足りるのでPath.globを使えばいい
2023/04/19(水) 18:12:08.30ID:PFleyHUL0
>>166
リストの内容が0から最大値まで連番になっていることを確認というならrangeで連番作ってそれと比較とかどうでしょう
重複や順番不問にするためにset使って
set(input_list) == set(range(0,len(set(input_list))))
みたいな
2023/04/19(水) 18:12:36.99ID:V36h4z9V0
>>180
最大値を先に把握できてるという状況がよくわからないけど
>>168のコードみたいにインタラクティブな逐次入力前提なのかな?
もしそうなら要素数も知れてるだろうからわかりやすくリストにappendしてソートで十分だと思うよ
2023/04/19(水) 18:17:25.11ID:V36h4z9V0
>>182
>目的のパスが静的に決定している場合のみの逐次処理にしないといけない
悪いけど何を言ってるか全然分からない
2023/04/19(水) 18:24:51.45ID:V36h4z9V0
>>184
単純なソートだと重複があったら簡単ではなかった
やっぱりsetだね
2023/04/19(水) 18:31:44.30ID:HyPlOTI2
ファイル操作をやってみるとわかるけど
ファイルを動かしたり名前を変えたりすれば
イテレータの状態と合わないことがある
やってみないとわからないけど
188デフォルトの名無しさん (ワッチョイ 7f33-S3w6)
垢版 |
2023/04/19(水) 19:28:54.64ID:c0AxLdlu0
>>172
これはID:r24Gen790が何を言いたいのか理解できてるのか?
189デフォルトの名無しさん (ワッチョイ 7f33-S3w6)
垢版 |
2023/04/19(水) 19:36:30.83ID:c0AxLdlu0
ていうか全体的に意味がわからん

l = ['1','2','3']
while l: l.remove(input())
2023/04/19(水) 21:38:08.88ID:V36h4z9V0
>>187
それはglob関係なく設計の問題
2023/04/19(水) 22:12:04.01ID:iYk70KDD0
os.walk
2023/04/19(水) 22:17:34.54ID:HyPlOTI2
いや設計も何もイテレータでやるならやったらいいし
再帰の部分でどのみちコードの量が二度手間以上になるから
メリット無さそうだし最初からflattenにする、という話なんだが・・

どっちもやった上で、イテレータ維持しようとすると面倒だからやめたって言ってるんだが
globやって、globやって、みたいなのならそりゃ書けるし
その程度の用途しかないなら無理してやらなくていいと思うよ
2023/04/19(水) 22:28:57.93ID:HyPlOTI2
あとこの人いつもいる?オブジェクト指向やら継承からの脱却、の人だと思うけど
違ったらすまんけど
この前、何がなんでも継承しない方がいいの?みたいなこと聞いたらどっか行っちゃったよね
自分はそれが正解か間違いかはわからないので純粋に聞きたかったんだが
設計って確実にその思想の部分に大きく影響されるよね
2023/04/19(水) 22:31:27.43ID:HyPlOTI2
関数型が正義と思っていてそう書かなきゃいけないなら
そりゃそうなるわ、としか言えんもの
2023/04/19(水) 22:38:25.10ID:iYk70KDD0
できあがりが見通しや効率で優れているかで判断すればいいのであって
手法は目的じゃないからあってるよ
ところでなしてos.walkつかわんの?
2023/04/19(水) 23:23:13.93ID:V36h4z9V0
>>195
os.walkでやってた多くのケースがPath.globやglob.globでまかなえるようになったからね
2023/04/19(水) 23:23:38.32ID:GSMGMYxg0
関数型プログラミングは高速化に寄与することもあるよねと思うところもあるし
オブジェクト指向やるならオブジェクト指向でやる必要がある場合に限ってやればいいし
だからといってオブジェクト指向やりたいなら、Pythonみたいな超高級言語じゃなくてC++でゴリゴリ書いたほうがメモリに優しいし高速だしって話になるよ?
2023/04/19(水) 23:26:57.39ID:GSMGMYxg0
何がやりたいかによって手段とツールが変わるだろうけど
Pythonでやるなら実装はC++も使ったほうが独自APIを実装するときの自由度が高い
2023/04/19(水) 23:40:18.23ID:V36h4z9V0
>>192
Path.globを知ってたら↓こんなコード書かないから
まずリファレンスを読もう
>PathEX(data_dir_path).find_dir(pattern).delete_files_with_chars(characters)

>再帰の部分でどのみちコードの量が二度手間以上になるから
それは書き方が悪いだけ
思い込みを捨てたほうがいい

>関数型が正義と思っていてそう書かなきゃいけないなら
関数型とは全く関係ないぞ
単純なforループを推奨してるんだからむしろ関数型とは真逆

>>190の設計の問題というのは>>187のような状況に陥るのは設計が悪いという意味
古典的な設計の問題だからわからなければググって勉強して
2023/04/20(木) 00:14:41.43ID:dFvm1wua
>>199
それは自作だからあえて変えてるだけで実際内部では実質
Path("ディレクトリやファイルのパス").glob(pattern).filter(処理for_each)
したり、再帰したり、しなかったりだよ
わざわざ存在しないクラス名、メソッド名使ってるのになぜそんな解釈したのかちょっと謎すぎる
globを使っていないわけではなくglobのイテレータ維持したまま最後の処理までするのは面倒なので断念しただけ

処理の部分が例えば”直接ファイル操作(removeなど)”みたいな投げっぱな単純な処理ならglob完結でいいけど
処理結果を返したり保持したい場合や、処理途中でファイル更新、単にパス名を文字列だけの用途として利用したい場合など個人的にあったので
あえてイテレータの恩恵少ないしforループ隠蔽するために、自分の場合はクラス化ほぼほぼ一択と判断しただけ
どの道、forループ処理は一度でも行う、はあなたがやってもだれがやっても行き着く事実であって設計云々ではないですね
あなたの想像し得る基本的な用途なら別にforループforループforループで良いしクラス化とか必要ないと思いますよ
見づらいだろうなぁとは思うものの、そこに関しては全然悪いとは思っていません
お好きなように
2023/04/20(木) 00:24:53.99ID:QMVhjkAJ0
os.walkオジサンになっていい?
2023/04/20(木) 00:25:34.76ID:dFvm1wua
実際forループで書いて管理しきれなくなってからのos.pathやらpathlibの拡張なんで
何がなんでもosのみpathlibのみで書く縛りがあるなら別に書けばいいと思うけど。
自分はあとあとのこと考えると管理面倒だからforループforループで管理は無理だな
「あのディレクトリの○○なファイルだけ発見したい」みたいな超シンプルな使い方のみの想定ならそれでいいと思うけど
2023/04/20(木) 01:25:19.09ID:R0tK1jDo0
>>200
うーん”設計”が伝わらないとは・・・
じゃPathEX(data_dir_path).find_dir(pattern).delete_files_with_chars(characters)で頑張ってくれ
俺は諦めた
2023/04/20(木) 08:09:16.58ID:uCwEPaTc0
ワッチョイ消してるやつの相手すんなよ...
2023/04/20(木) 09:18:43.87ID:Gkc0C+yM0
IPは消してたけどワッチョイ消したことはないな
なんだろう
うまい喩えが見つからないけど、死ぬほど恥ずかしい
2023/04/20(木) 09:26:39.56ID:dFvm1wua
>>203
いや1レス目からもう十分伝わってますよ
>メソッドチェーン化したいという理由があるのかもしれないけど
>それはPythonのやり方ではない
というあなたの設計思想は >>177
誰が見ても違和感でしかないですよ
標準ライブラリでその恩恵を預かりながら自作では徹底してforループ
決められたこと以外は出来ない
狂信とまではいいませんけど、頑張ってください
207Jun (ワッチョイ 7fda-F1k0)
垢版 |
2023/04/20(木) 23:59:27.49ID:ohUBo7l50?2BP(0)

Pythonはシンプルな言語だがオモチャでない。
2023/04/21(金) 01:14:13.92ID:KCdL0+Bq0
いろいろ目をつむらないとシンプルに扱えないから
玩具の品質には到達していないのはわかる
2023/04/21(金) 01:27:36.69ID:fM6D7Jjb0
おもちゃとは考えが逆だろう
最小のコードで複雑なことができたら楽しい
pythonは暗黙でいろんなことが決まるのを避けるので、何かするならきっちり指定する
きっちり指定してきっちり動いても何も面白くはない
210Jun (ワッチョイ a6da-Fj9N)
垢版 |
2023/04/22(土) 23:31:49.33ID:ZUue34CB0?2BP(0)

Python以外で何かいい言語はありますか?
2023/04/23(日) 00:04:54.40ID:DlHbN44X0
GoやってGoの仕事に就くとしばらく食える
2023/04/23(日) 00:11:46.19ID:Y0v5ztu40
pep8とzenくらいやっとけばMonkになれる
2023/04/23(日) 00:12:41.43ID:Y0v5ztu40
所謂monkに文句無し的な
2023/04/23(日) 00:13:34.99ID:Y0v5ztu40
ふふってなった ちんこ痒い
2023/04/23(日) 01:40:11.94ID:RcbzEQSV0
香ばしいレスが多いな
216Jun (ワッチョイ a6da-Fj9N)
垢版 |
2023/04/23(日) 02:06:25.42ID:F2K2mK+f0?2BP(0)

Go言語はCから学ばなくても修得できますか?
2023/04/23(日) 02:32:01.30ID:X2+aRqhz0
Rustとまちがってない?
まーどの高級言語も先にCやってた方がだんぜん理解深まるけどね
218デフォルトの名無しさん (ワッチョイ a633-F6q8)
垢版 |
2023/04/23(日) 14:44:10.81ID:U/RsZCHU0
>>217
今は順番が逆
2023/04/23(日) 15:34:25.39ID:fUzoPDLKa
文系でウェブ系なら、Ruby on Rails 1強。
米国年収でも、Rails, AWS Solution Architect が13万ドル

Ruby, Elixir : 9.3 万ドル
Go : 8.9
Rust : 8.7

多くの言語 : 6.5〜7

PHP : 5
Dart : 4.4

日本では、バックエンドの求人倍率が数倍で、
フロントが0.5倍と、10倍の開きがある。
フロントは供給過剰で、低価格競争になっている

つまり欲しい人材は、Rails, Linux, Docker, AWS が出来る香具師

YouTube で有名な雑食系エンジニア・KENTA は、
キャリアパスを、Rails → Go のみと言ってる

理系ならPython で、大学院数学科とか、AWS 機械学習の資格など
220Jun (ワッチョイ a6da-Fj9N)
垢版 |
2023/04/23(日) 23:53:51.08ID:F2K2mK+f0?2BP(0)

PythonとGoを両方やることにします。Goも教材がたくさんありますね。現在、人気の
言語ですね。
2023/04/24(月) 00:07:55.90ID:HkcOJ3w60
結局ベースにCがあるんだよな
Cでも書けることを、より簡単に、より堅牢に、より保守性高く、書き直しているに過ぎない

そもそもCで書けんわというアーキテクチャーが登場するまで、Cは残り続ける
222Jun (ワッチョイ a6da-Fj9N)
垢版 |
2023/04/24(月) 23:39:25.46ID:xypANbuI0?2BP(0)

C言語。デニス・リッチーですか。長寿の言語ですね。WindowsOSもC言語で書かれて
いるんですね。
2023/04/25(火) 13:51:41.19ID:FPTpqTcN0
goやpythonよりもPHPやったほうが良い
2023/04/25(火) 22:11:51.74ID:+HdKZSwh0
Webアプリ以外でもPHPで書くの?酔狂やね
2023/04/26(水) 12:04:22.99ID:cIPQx0Y6a
MLでPHPとPython使うだろうjk
2023/04/26(水) 18:39:27.90ID:JavlcTjg0
perlで作ったツールを移植してるけど

if key3 not in d[key1][key2]:
 d[key1][key2][key3] = {}

みたいなのがたくさん追加で要る
しかもループの中で毎回評価してて気持ち悪い
autovivificationを使わずに多次元辞書をすっきり書けないものか
227デフォルトの名無しさん (ワッチョイ 6646-0EuI)
垢版 |
2023/04/26(水) 21:19:22.89ID:vPfd2wHV0
暗黙の初期化のような、うちうちのノリが多くて、Perlは嫌われたんだろ。
2023/04/26(水) 21:33:02.57ID:JavlcTjg0
keyが存在するかどうかのチェックはどうせ毎回やってるんだから同じことか
2023/04/26(水) 22:20:00.88ID:VuAuol7y0
defaultdict
2023/04/26(水) 22:29:32.74ID:JavlcTjg0
from collections import defaultdict
d = defaultdict(dict)
d['a']['b']['c'] = 1 # KeyError: 'b'

2次元までなら
2023/04/26(水) 22:43:05.12ID:k7DLXEM30
辞書をそんなネストしないといけない時点で根本的に設計がおかしいのでは?
2023/04/26(水) 22:47:14.72ID:VuAuol7y0
def deepdict(): return defaultdict(deepdict)
d = deepdict()
d['a']['b']['c'] = 1
もっとうまく書けるかもしれんけど
2023/04/26(水) 22:52:56.90ID:JavlcTjg0
dictだけ続くならいいけど、listが混ざったりするんだよな
2023/04/26(水) 22:56:15.01ID:VuAuol7y0
後出しは書く必要ない
任意の関数渡せるんだからスキにしたらええ
2023/04/26(水) 23:03:54.93ID:JavlcTjg0
a[1] がlistなのかdictなのか判らんという時点で、pythonでは自動は無理なんだよな

l = []
l[1] = 1 # IndexError

perlはこれが出来るというのも、かなりの飛躍がある
236デフォルトの名無しさん (ワッチョイ a633-ASru)
垢版 |
2023/04/26(水) 23:05:17.48ID:sUnbpfBB0
jsonで受け取ったデータをデコードしてそのまま使ってるとかじゃないの
2023/04/27(木) 16:04:02.47ID:BTOHfqgT0
if m := re.search(パターン1):
 処理1
elif m := re.search(パターン2):
 処理2
else
 処理3

みたいに書いていたものを、:= を使わないように変更
m := re.search(パターン1)
if m:
 処理1
else:
 m := re.search(パターン2)
 if m:
  処理2
 else
  処理3

気持ち悪い
elifは展開するともともとこういうものだから仕方ないのか
2023/04/27(木) 16:11:37.78ID:Noc5t00Md
assignment expressionが必要になった理由がそれだから仕方ないね(pep572)
2023/04/27(木) 16:43:35.35ID:SfEpe4Pu0
m = None
def search(pat):
____global m
____m = re.search(pat, str)

こういうのを直前に書くとか
2023/04/27(木) 16:50:03.39ID:BTOHfqgT0
re.searchは別関数にしたいとは常々感じてる
m.groups() を返してくれると有り難い
マッチしなかったら[]を返すようにすれば、ifにそのまま入れられる筈

なんで正規表現回りこんなに不便なんだろう
241デフォルトの名無しさん (ワッチョイ a633-ASru)
垢版 |
2023/04/27(木) 18:30:59.89ID:5qwnrWFd0
競プロで複数行の標準入力を受け取るとき、stdinを使った方がだいぶ早いみたいな記憶があったんだけど、今はだれも使ってない
これは自分が何か記憶違いをしてる?
242Jun (ワッチョイ a6da-Fj9N)
垢版 |
2023/04/27(木) 23:58:21.80ID:CoNlHc/S0?2BP(0)

Pythonはオブジェクト指向とデータ隠蔽の所が面白い。
2023/04/28(金) 00:38:35.47ID:fNFGtOF30
ハードウェアやdbの設計やらセキュリティやら色々大変だよ
まじで全部はやれそうに無い
2023/04/28(金) 01:17:05.61ID:0Z+HC9sf0
>>241
だれも?
まわりみんなPowerShellユーザなの?
245241 (ワッチョイ a633-F6q8)
垢版 |
2023/04/28(金) 07:46:56.36ID:X3vhIzka0
2系の時の話だったかもしれん
246241 (アウアウウー Sa21-F6q8)
垢版 |
2023/04/28(金) 09:49:13.94ID:gpbxWykPa
>>244
どういうこと?
247デフォルトの名無しさん (アウウィフ FF21-YWDm)
垢版 |
2023/04/28(金) 10:58:04.57ID:pksuSfeeF
>>240
matchなんか使うからだ
findallで良い
2023/05/03(水) 19:16:59.83ID:LjnRJYKu0
個人でプログラムしている程度の素人からの質問です
dataclassでクラスの作り方を覚えたら従来のクラスの作り方を覚える必要ってありますか?
dataclassでできないことがイマイチ分からなくて・・・
■ このスレッドは過去ログ倉庫に格納されています