実現したいこと
内包表記で、リストを含むディクショナリのデータを作成する方法について知りたい
発生している問題・分からないこと
内包表記でない下記コード例の出力を出したいです。
内包表記でディクショナリのキーまで重複せずに出るのですが、
そのキーに属するデータをリスト化できませんでした。
該当のソースコード
python
1from dataclasses import dataclass 2from collections import defaultdict 3 4@dataclass 5class placeSort: 6 num : int 7 place: str 8 9pls = [] 10pls.append(placeSort(num = 3 ,place = 'A')) 11pls.append(placeSort(num = 3 ,place = 'B')) 12pls.append(placeSort(num = 3 ,place = 'A')) 13pls.append(placeSort(num = 2 ,place = 'C')) 14pls.append(placeSort(num = 2 ,place = 'D')) 15pls.append(placeSort(num = 1 ,place = 'E')) 16 17#<内包表記でない例> 18res0=defaultdict(list) 19lbuf = list() 20for item in pls: 21 if res0.get(item.num) == None: 22 lbuf = list() 23 lbuf.append(item.place) 24 res0[item.num]=lbuf 25 else: 26 lbuf =res0.get(item.num) 27 lbuf.append(item.place) 28 res0[item.num]=lbuf 29print(res0) 30#出したい出力 31# defaultdict(<class 'list'>, {3: ['A', 'B', 'A'], 2: ['C', 'D'], 1: ['E']} 32 33<内包表記で、できたところまで> 34#キーの一覧をだす 35res1 = [z for z in {x.num for x in pls}] 36print(res1) 37# [1, 2, 3] 38 39#キーの一覧毎の、リストをまとめたいができません 40res2 = [(z,y.place) for y in pls for z in {x.num for x in pls} if y.num==z] 41print(res2) 42#[(3, 'A'), (3, 'B'), (3, 'A'), (2, 'C'), (2, 'D'), (1, 'E')] 43
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
res2の出力まで出しましたが、リスト化できませんでした。
補足
特になし
XY問題 https://ja.meta.stackoverflow.com/questions/2701/#answer-2702 になっていて、
defaultdictやsetdefaultを使ってfor文で書くのが正着で**内包表記で書くべきではない(書けない)** 処理にしか思えないので「なぜ内包表記で書きたいのか?」が欲しい気がします。ただの気分でないなら、質問者さんに必要な回答を書くためにはその理由の方が大事になるかと
ご回答ありがとうございます。
dict型を今まで、使用していましたが、dataclassを代わりに使用して便利にデータを
管理できないかと考えたのが発端です。setdeaultを使用すると簡単にできることを知りませんでした。
ありがとうございます。
回答3件
あなたの回答
tips
プレビュー