Pythonのお勉強 Part75 (988レス)
1-

861: (アウアウウー Sa53-ilUi) 09/14(日)20:28 ID:uqktGAy2a(1) AAS
まるちんこ
862
(2): (ワッチョイ ff02-LMNA) 09/19(金)12:09 ID:qGqvKNvA0(1) AAS
awkで以下のように連想配列を使ってます
BEGIN {
 arr["id1"] = "val1";
 arr["id2"] = "val2";
 printf(arr["id2"]);
}
→結果は「val2」

また、以下のようなid列、val列のCSVファイルがあります
id1,val1
id2,val2

これらのものを使い、Pythonでも同様に、idが指定した値に合致するval列を取得したいと思ってます

以下のようにcsv.DictReaderを使ってディクショナリに読み込んでみることはできました
with open('data/data.csv', 'r') as file:
  d = list(csv.DictReader(file, fieldnames=['id', 'val']))

このリストを列挙して中身を表示する等はできたのですが、
指定したidに合致するval列を取得する方法が分かりません

よい方法を教えてください
863: (ベーイモ MM8f-xxKh) 09/19(金)12:24 ID:4hZSGpQJM(1) AAS
>>862
1. そのレスを丸ごとコピーします
2. ChatGPTやClaude等のAIの入力欄に貼り付けます
3. メッセージを送信します
4. (゚д゚)
864: (ワッチョイ 3f32-yasC) 09/19(金)12:53 ID:jazVqD/P0(1) AAS
ありがとうございます!!
865
(1): (ワッチョイ 8ff0-0uML) 09/19(金)13:17 ID:2/pebCZF0(1) AAS
d['id1'] で 'val1' を参照できるようにしたいということなら、各行ごとに1つのdict にするんじゃなくて、全体を1つのdict にする方がいいのでは。 d = { id: val for id, val in csv.reader( file ) } とかは?
866
(1): (スフッ Sd5f-ilUi) 09/19(金)13:47 ID:tcJc82E7d(1) AAS
with open('data/data.csv', 'r') as file:
  d = csv.DictReader(file, fieldnames=['id', 'val'])
print(d['idHOGE'])
867: (ワッチョイ 4f01-hzaU) 09/19(金)16:26 ID:vOzhAdtP0(1) AAS
今はChatGPTでも重複時はどうしますか?ってちゃんと確認してくるんだな
出てくるコードの質はともかく要点はほぼ全部網羅してくれてめちゃ親切
868: (ワッチョイ 7f36-IHfe) 09/19(金)18:19 ID:7aePTcRM0(1) AAS
chatGPTにプログラムの質問をするときは必ずThinkingモードにすること 
デフォルト設定だとThinkingしないクソコード出してくることが多い
869: (アウアウウー Sa53-ilUi) 09/19(金)19:23 ID:hOahK7C8a(1) AAS
ちっとは考えろやバカタレ
870: (ワッチョイ 3f02-VRQG) 09/20(土)18:48 ID:usmEJHWE0(1) AAS
Visual Studio Codeの変数ウォッチウィンドウが見づらいわ
他にないのかね?
871
(1): (ワッチョイ 8ffc-tBek) 09/20(土)19:05 ID:FzwQ5fID0(1) AAS
現状VSCodeかPyCharmの二択だからPyCharmかな試すなら
やりたいことによってはJupyterが最強の場合もある
872: (ワッチョイ 0602-faWY) 09/21(日)10:32 ID:oeEC4MB10(1) AAS
>>865
>>866
回答どうもです

いろいろと見直し、全体を1つのdictにする、という方針として、以下のようにしました
awkの連想配列とPythonの辞書の違いを再認識しました

with open('data/data.csv', 'r') as file:
  d = csv.DictReader(file, fieldnames=['id', 'val'])
  result = {row['id']: row['val'] for row in d}
print(result['id2'])
→val2が得られる
873: (ワッチョイ 0601-WLcO) 09/21(日)12:52 ID:wuI8+BKP0(1) AAS
id重複時に黙って後勝ちになるが望ましいかどうか
874
(1): (ワッチョイ 6a04-lG8I) 09/21(日)13:04 ID:ttcu4MUo0(1/2) AAS
そんなことはどうでもいいだろうよ
責任の所在の話したってしょうがないでしょ
875: (ワッチョイ 8a02-CSnM) 09/21(日)14:22 ID:RnLJIZeo0(1) AAS
>>871
まあ、PyCharmも似たようなもんだね…
業務レベルなので、Jupyterは無理かな…
876: (ワッチョイ 3bf6-4qXD) 09/21(日)14:41 ID:KUfqxhia0(1/3) AAS
awkのことはよく知らないが、連想配列でキーの重複があるの?
877
(1): (ワッチョイ 6f54-vMDn) 09/21(日)15:03 ID:TKqe4uhF0(1/2) AAS
あんなのはハッシュだしな
どうやって衝突回避してるのか謎だった
今も謎
878
(2): (ワッチョイ 9301-xzLD) 09/21(日)15:34 ID:kS1Ctw9y0(1/2) AAS
>>874
外部ファイルから読み込むのに重複時の振る舞いがどうでもいい場合なんてある?

仮に後勝ちは望ましくないがチェック処理を入れるくらいならサイレントにバグるので問題ないケースだとしてもそういう確認とか意思決定は明示的にしないといけないんじゃない
879: (ワッチョイ 9301-xzLD) 09/21(日)15:37 ID:kS1Ctw9y0(2/2) AAS
>>877
ハッシュの衝突を回避してるわけじゃなくて衝突してもいいような構造にしてるだけ
その代わり衝突が増えるにつれ性能が悪化していく
880
(1): (ワッチョイ 3bf6-4qXD) 09/21(日)15:54 ID:KUfqxhia0(2/3) AAS
862を読む限り、csvファイルのキー列の値のユニーク性は前提になっていると思うんだが。だから連想配列とかdictに入れるって想定なんじゃないの?
881
(1): (ワッチョイ 6a04-lG8I) 09/21(日)15:59 ID:ttcu4MUo0(2/2) AAS
>>878
データの操作とデータ構造の検査は切り分けることが出来る話でしょ
質問はデータ操作なんだからそっちにフォーカスすればいい
IDなんて名前なんだから作成元が非重複を保証してんのかもしれんし、貰い手側が質問の処理の前段でなんかチェックさせてもいい
いずれにしてもこの質問では考慮する必要のないかつ混同する必要のない事柄ってこと
882
(1): (ワッチョイ 732a-ljyC) 09/21(日)16:40 ID:e5nOC9aY0(1) AAS
>>878
> 外部ファイルから読み込むのに重複時の振る舞いがどうでもいい場合なんてある?

ログファイルを読み、とある項目の最新内容が欲しい場合とか。
883
(1): (ワッチョイ 8701-xzLD) 09/21(日)17:30 ID:7OCfaZ6W0(1) AAS
>>881
俺は分けることができるとも分けたほうがいいとも思わないから考え方の違いだね
チェックを入れると内包表記を使わないほうがよくなる可能性が高かったりするわけでデータ操作と呼んでるところの内容が変わってくる

>>880
ユニークが前提となっているからどうでもよいじゃなくて「ユニークが前提なので万が一重複が来た時は後勝ちで問題ない」というところまで明確に判断しておいたほうがいいんじゃないのという話

>>882
それはどうでもいい場合じゃなくてログを読む方向に合わせて後勝ちか先勝ちかどちらか一方に仕様を決めなければいけない場合だと思う
884: (ワッチョイ 6f54-vMDn) 09/21(日)17:58 ID:TKqe4uhF0(2/2) AAS
何かの関数の戻り値を渡す、みたいに動作が決まってたら決め打ちでいいけど、
ファイルや通信なんか何でもありなので、
そもそも開けない、通信できない、から始まって、間違いまくったデータでもちゃんと動かないと
885
(2): (ワッチョイ 3bf6-4qXD) 09/21(日)19:55 ID:KUfqxhia0(3/3) AAS
>>883
ユニーク性が前提となっていることを明確にしておくのはいいことだけど、ユニーク性を前提として設計しているにも拘らず「万一重複が来た」らそれ自体大問題だと思うけど。それは想定していた前提が成立していないということでしょ。そもそも862のようにid値を検索キーとして使う場合で「後勝ちで問題ない」場合なんてあるかな?

重複がないということを前提にできるからこそdictを使っているのであって、前提が変わってくるならデータ構造の選択とかも変わってくると思うけど。一般論としてデータに重複があっても問題がない場合かどうか気をつけようということなら素直に頷けるんだけど、862のケースで主張するのはムリがあると思うよ。
886: (アウアウウー Sacf-kv3/) 09/21(日)19:56 ID:kxRRh56Ha(1) AAS
うましかいないよな
887: (ワッチョイ 8eaf-wBym) 09/21(日)20:54 ID:ORrZGGDb0(1) AAS
外部リンク[htm]:mannersy.co.jp
888: (ワッチョイ 2e01-xzLD) 09/21(日)23:42 ID:4W4Jokme0(1) AAS
>>885
個人的にはソフトウェアの設計は想定している前提が成立していない場合の対応まで決めるものだと思ってるけど、今回のはそんな大げさな話じゃないよね

後勝ちになる実装を採用してることを自覚してそれで問題ないと判断できてるかどうか
889
(1): (ワッチョイ 1e10-4qXD) 09/22(月)00:15 ID:scIzhboY0(1/2) AAS
重複がありうる状況なら、後勝ちで上書きしてしまう仕様で問題ないわけないだろ。862みたいに検索キーとして使っている場合に。誰がそんな状況でdictを使うんだよ、あほか。
890: (ワッチョイ 2e01-xzLD) 09/22(月)00:42 ID:nbJbLtLI0(1/2) AAS
>>889
上で出てきたログの例を理解できない?
後勝ちでいい例なんていくらでもあると思うんだが
1-
あと 98 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.011s