onigiri_dic = {}
onigiri_dic.update(temaki_dic, **kinsyari_dic, **motimugi_dic, **sonota_dic)
user_onigiri = input("キーワードを入力してください。シーチキンなど。\n")
result_oni = {}
for key, value in onigiri_dic.items():
if user_onigiri in key:
result_oni[key] = value
if len(result_oni) == 0:
print("商品リストにありません。")
else:
for key, value in result_oni.items():
print(f"{key}:{value}円")
# builtins.py 2975行目
def __init__(self, seq=None, **kwargs): # known special case of dict.__init__
"""
dict() -> new empty dictionary
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
# (copied from class doc)
"""
pass
たかちゃんさんの投稿
(投稿ID: 5341)
Webのページのソースを表示し、手動(コピペ)でデータを持ってきましたが、
「”」が微妙に違い、dictionaryを書いた時、pycharmできちんと認識されずハマりました。
また、If文とfor文のインデントでもエラーになりハマりました。
Dictionaryのデータが空の時の判定が、len(choice_dic) == 0で判定できるのが楽だと感じました。
辞書の部分が長く申し訳ございませんが、記念に投稿します。(^^)
たかちゃんさんのコメント
(コメントID: 7607)
辞書の下のこちらの行は削除忘れとなります。m(_ _)m
temaki_dic.update(kinsyari_dic)
たかちゃんさんのコメント
(コメントID: 7608)
Dictionary部分は長いので省略します。
辞書への新規追加や更新の書き方が、意外と直ぐに思い付かず少しハマりました。
小川 慶一さんのコメント
(コメントID: 7618)
python ぽいデータの持ち方で表現すると、たとえば以下のような感じです。
onigiri {} の key はおにぎりのタイプ。 value はそのタイプのおにぎりのリスト。
リストの各要素は、 name, price をキーとした値を持った辞書です。
出力結果は以下のようになります。
小川 慶一さんのコメント
(コメントID: 7620)
似たような感じですが、辞書の key におにぎりのジャンル、 value にはそのジャンルのおにぎりの名前を key に、金額を value にした辞書を入れました。
出力結果は以下のようになります。
藤本 博子さんのコメント
(コメントID: 7624)
辞書の値(value)で、辞書やリストを指定する方法、その値を取り出す方法など、よい練習になりました。辞書は、共通のキー(key)で値を取り出せるし、すごく便利だと思いました。
たかちゃんさん、ishiiさん、小川先生 ありがとうございました。
たかちゃんさんのコメント
(コメントID: 7625)
Onigiriというdictionaryを作成し、keyは「手巻きおにぎり」等、valueは[○,○,・・・]リスト。
このリストの中に、name:とpriceをキーにした辞書が8個ある。(手巻きおにぎりの場合)
最初、name:とpriceをキーにした辞書は、「onigiri =」のようなものが無いので「あれ?」と思いましたが
よく考えたら、
value[0]の中に、辞書の{‘name': "熟成紅鮭", 'price': 160, }
value[1]の中に、辞書の{'name': "熟成紀州南高梅", 'price': 125, }
という具合に入っているのですね。
2番目の辞書の中の辞書パターンもとても勉強になりました。
「onigiri = {辞書}」と毎回記述しなくても、リストや辞書の要素の所に何でも入れられるのですね。
お陰様で、使い方が段々分かってきました。ありがとうございました。m(_ _)m
小川 慶一さんのコメント
(コメントID: 7632)
早めに慣れていきましょう!
aliceさんのコメント
(コメントID: 7644)
みなさんありがとうございます!!
仕事でよく見るのが小川先生のコメントID: 7618 のサンプルなので、そちらをお借りしました。
2次元リストを作成して、openpyxlを使ってExcelに出力しました。
もうちょっと良い書き方あるよ!などありましたら教えてください。
月曜の朝から憂鬱でしたが、ちょっとだけ出勤したくなりました(●'◡'●)
関数化したいです!
出力結果
小川 慶一さんのコメント
(コメントID: 7649)
次は、エクセルシートからデータをひろってきて onigiri 辞書みたいなものを作ってみてください。
この両方の出入りを自在にできるようになれば、 python での変数の扱いについても初心者卒業!です (^^
田中 宏明さんのコメント
(コメントID: 7650)
コピペで動かして、Excelに出力されました。すごく勉強になります。
辞書の階層構造(下記)も、理解できました。
> onigiri {} の key はおにぎりのタイプ。 value はそのタイプのおにぎりのリスト。
> リストの各要素は、 name, price をキーとした値を持った辞書
Excelマクロの連想配列で同じ階層構造を実装することを考えると、Pythonは楽ですね。
小川 慶一さんのコメント
(コメントID: 7651)
VBAの連想配列よりも日常的です。
辞書は、Pythonでは、主役級の登場人物です。
aliceさんのコメント
(コメントID: 7653)
限界ですー。燃え尽きましたー。力尽きましたー。
自在とは程遠いです╰(艹皿艹 )
でもこれができたら、ExcelのデータをJSONにしてAPIを使ってデータを登録するとかできますよね。
会計データだとおにぎりのタイプ(手巻きおにぎり)がヘッダー行(日付、伝票№など)、おにぎりの名前・値段(熟成紅鮭, 160)が明細行(勘定科目、部門、金額、適用など)になるのかな?
Excelのデータをヘッダー行と明細行に分けてJSONを作るなんで絶対無理だと思っていたし、登録・更新は怖いので全然考えていなかったのですが、いつかやってみたいなーと思うようになりました。
しかし、自在とは程遠いです╰(艹皿艹 )
田中さん
動かしていただきありがとうございます!
Excelマクロの連想配列で同じものを作るなんて、どうやったらよいか私には想像もつきません(ノへ ̄、)
田中さんは実装できそうなイメージです。
ぜひぜひPythonで書かれたら教えてください!
きっとシンプルでわかりやすいコードを書かれるんだろうなと思っています。
出力結果
※もしお試しされる方がいらっしゃいましたら、上のExcelを出力するコードを先に実行してください。
お時間のある方、一緒に遊んでくださーい(❁´◡`❁)
コードを共有していただけたら嬉しいです!
田中 宏明さんのコメント
(コメントID: 7654)
ExcelデータがPython辞書になってますね。すごい。
コードは未熟のためコメントできませんが、実務への応用をイメージしながら動かしてみました。
でも、データベースの登録・更新は、だれかチェックしてくれる人がいないと怖いですね。
keiko ishさんのコメント
(コメントID: 7655)
私もexcelに出力するコードを書いてみました👩💻
本当に、ありがとうございました。感謝👏
後で、Excelファイルを読み取って辞書化、チャレンジしてみます。
keiko ishさんのコメント
(コメントID: 7656)
後で、辞書化やります💦
keiko ishさんのコメント
(コメントID: 7657)
関数を作成して、Excelから辞書を作ってみました。
(発熱外来で緊急対応をしていることがあります。今後、返信が遅くなったらすみません🙇🏻♀️)
keiko ishさんのコメント
(コメントID: 7658)
(訂正前) 25行目
(訂正後) 25行目
小川 慶一さんのコメント
(コメントID: 7661)
さっそくやりきるって、すごいです。
以下の for 文内での *values での2つ目以降の引数の持ち方など、秀逸!
> keikoさん
create_data は、とてもすっきりしていて良いですね。
僕のほうで準備中のサンプルコードもこういう感じになります (^^*
あと、変数名や仮引数名は、名称から内容を期待させるもののほうが良いです。
(keiko さんは分かっててやってらっしゃるのでしょうけど、このコメントを読まれる他の方向けに記載しています)
例:
であれば、以下のように。
細かいですが、以下は、関数を別途定義しなくてもよさそうに思います。
それから、 print 文は戻り値を返さないので、 return print('') は常に None を返すのでは?とも。
そんなところしか言わなければならない点がないのですが、いずれにせよ、すごいです (^^*
keiko ishさんのコメント
(コメントID: 7663)
(お陰様で、以前より、ITスキルが上がった気がします)
引数の指定、x,yよりname,priceの方が良いですね👏
ws_areaも、今後使っていこうと思います。
それと、関数作るより、キーワード引数で作成できること、すっかり見落としていました😅
実行結果:{key1: value1, key2: value2}
いつも、いきなり関数から書いちゃってます💦
(欲しいものをreturnに書いて、defと引数を手早くつけています)
printに関しては、関数のreturnにつけちゃダメでした😅
(おっしゃる通り、何も返さなくなります)
にして、
の方が良いですね。
keiko ishさんのコメント
(コメントID: 7664)
アンパックを使ったやり方、すごく勉強になりました。
ありがとうございました😄感謝👏
key, *valuesとすることで、key以外のvaluesをアンパックでlistに格納するの、
素晴らしいです。
田中 宏明さんのコメント
(コメントID: 7665)
keiko ishさん
おかげさまで *values が 残りの値を list で受け取ることを理解しました。
小川 慶一さんのコメント
(コメントID: 7666)
>key, *valuesとすることで、key以外のvaluesをアンパックでlistに格納するの、素晴らしいです。
>おかげさまで *values が 残りの値を list で受け取ることを理解しました。
手練れの技ですよ。
初心者のものではないです (^^;
aliceさんのコメント
(コメントID: 7668)
アンパックの件は、最近JavaScriptの残余引数とスプレッド構文について調べていたときに、Pythonだとどう書くのかな?と調べて知りました。
田中さん
おつきあいいただきありがとうございます!
データベースの更新は怖いですね。
そういうことも含めて実装できるようになったらカッコいいなーと思います。
たかちゃんさん
たかちゃんさんのおにぎりのおかげで今週はたくさん学べました。
ありがとうございます!
たかちゃんさんのおにぎりや星座のお題にあったテーマの選び方のセンスが素敵だなーといつも思っています。
安納芋もみていただきありがとうございます。
keikoさん
コードをシェアしていただきありがとうございます。
こんなすっきりかけるんですね(●'◡'●)
Excelからの取り出し方や辞書の作り方などとても参考になりました!
またいろいろ教えていただけたら嬉しいです。
小川先生
変数名を考えるのが苦手すぎるので参考になりました。(毎回悩んでます…。)
せっかくなので変数用辞書でも作ろうかな?
それと、もう1個やりたかった売上を集計するコードを書いてみました。
辞書バージョンはあきらめていたのですが、keikoさんのコードを参考にenumerate関数とdict関数を使ってみたらできましたー。
ありがとうございます!嬉しい(❁´◡`❁)わーい!!
少しずつですが辞書に慣れてきた気がします。
出力結果
余談ですが「Shift」+「F6」のRenameを使って変数名を一括変更したらスコープが「Project Files」になっているのに気づかなかったのでまぁまぁ事件になりました(^^;
Pycharmにはいろんな機能があるんですね。
小川 慶一さんのコメント
(コメントID: 7671)
>変数名を考えるのが苦手すぎるので参考になりました。(毎回悩んでます…。)
>せっかくなので変数用辞書でも作ろうかな?
グループ掲示板にさきほど僕が投稿したコードをここでもシェアします。
どんな変数名を使っているか...拾っていってみてください。
「どんな性質の値が格納されているのか」が分かるような変数名で。
単語をアンダースコアでつなげて、変数名が長くなることをいとわずに。
てとこでしょうか。
変数名については、長くなっても、pycharmの入力補完機能を使って入力すれば「正確な記述が負担」ということもないです。
aliceさんのコメント
(コメントID: 7675)
今回のコードで使われている変数名
reader:csv.DictReader
fields:csvのフィールド名(リスト)
data_type_list:csvから取得したデータを入れるリスト
row:csvのフィールドとレコード(辞書、key:フィールド名、value:レコード)
key:rowのkey(文字列、フィールド名)
value:rowのvalue(文字列、レコード名)
type_name:データ型名(文字列)
result_list:関数get_type_infoの戻り値(リスト)
今回つけていただいたコードと、過去のコードすべて拝見しました。
(せっかくなので自分用に変数とコードのデータベースを作りました。これでいつでも練習できます(●ˇ∀ˇ●))
>「どんな性質の値が格納されているのか」が分かるような変数名で。
>単語をアンダースコアでつなげて、変数名が長くなることをいとわずに。
リスト:○○_list
辞書:○○_dicまたは○○_dict
変数名もですが、関数名ではちゃんと書かないと後で見たときにわからなくなると思いました。
辞書のitemsメソッド
for key, value in dict.items():
for k, v in dict.items():
key,valueは何が入っているかわからないのであまり使わない方が良いのかと思ったのですが、そんなことはないというのがわかりました。
あと、辞書を入れるリストで「○○_dic_list」という書き方と、リストのfor文での「for ○○ in ○○_list」と書かれていたのはわかりやすいのでマネさせていただきます(❁´◡`❁)
こういう発想が自分では出てこないので勉強になりました。
小川 慶一さんのコメント
(コメントID: 7678)
こういう地味な学びは良いですね (^^
>> key,valueは何が入っているかわからないのであまり使わない方が良いのかと思ったのですが、そんなことはないというのがわかりました。
for ブロック内のコードのボリューム次第でしょうかね。
for k, v in dict.items(): ではじまったブロック内で消え失せる運命の、短い行数内でしか使わない変数ですので、ここはそんなに気にされなくて良いかと。
for 文の中でさらに value から取り出した辞書があって...等々となってくると工夫が必要ですが。
>> 「for ○○ in ○○_list」と書かれていたのはわかりやすいので
親子関係が分かりやすくなるような書き方というのは、割と僕は意識しています。
keiko ishさんのコメント
(コメントID: 7682)
for文の変数名についてですが、
dict関数を定義しているdocsには
と書かれていました。
(もちろん、key,valueと表記しても、明示的でとても親切だと思います)
公式にk, vが使われているので、私は消える変数名の場合は使っちゃうかもしれません。