質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

229閲覧

辞書で取り出した複数の値に対するキーをリストとしてリストに格納したいです

dd_

総合スコア111

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/25 10:03

編集2021/11/25 10:15

やりたい事

python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3}

この辞書から
値を順番に取り出し
値の合計が5以上になったら
合計した値に対するキーを
空のリストにリストとして格納していきい
また繰り返し同じ処理をさせる
といった事をしたいです。

下の様な実行結果を得たいです。

[["あ","い"],["う","え","お"],["か","き","く"],["け","こ"]]

やったこと

python リスト内リスト 作成
python リスト 多次元
でサイトを見ながら下のように書いてみました。

python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 2li = [] 3n = 0 4for i in dic2.values(): 5 if n < 5: 6 li.append(dic.keys) 7 n += i 8 if n >= 5:

python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 2li = [] 3n = 0 4for i in dic2.values(): 5 if n < 5: 6 li.append([dic.keys]) 7 n += i 8 if n >= 5:

といろいろと試してみましたが
私の理解力が低く、なかなか上手くいかず
こちらで質問させて頂きました。

どうしたら得たい実行結果を取得できますでしょうか?
教えて頂けると幸いです。
宜しくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

itertoolstakewhileaccumulate を使ってみました。

python

1from itertools import takewhile, accumulate 2 3dic2 = { 4 "あ":2, "い":3, "う":1, "え":3, "お":3, 5 "か":2, "き":1, "く":2, "け":2, "こ":5, 6} 7 8keys, vals, result = [*dic2.keys()], [*dic2.values()], [] 9while vals: 10 limit = len(list(takewhile(lambda a: a < 5, accumulate(vals)))) + 1 11 if sum(vals[:limit]) >= 5: 12 result.append(keys[:limit]) 13 keys, vals = keys[limit:], vals[limit:] 14 15print(result) 16 17# 18[['あ', 'い'], ['う', 'え', 'お'], ['か', 'き', 'く'], ['け', 'こ']]

投稿2021/11/25 12:35

編集2021/11/25 12:38
melian

総合スコア19849

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

reduce を使ってみました。

python3

1from functools import reduce 2 3 4def reducerFunc(acc, cur): 5 if sum(acc[1][-1]) >= 5: 6 for i in range(2): 7 acc[i].append([cur[i]]) 8 else: 9 for i in range(2): 10 acc[i][-1].append(cur[i]) 11 12 return acc 13 14 15dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 16 17result = reduce(reducerFunc, dic2.items(), ([[]], [[]]))[0] 18 19print(result) 20

出力結果:

[['あ', 'い'], ['う', 'え', 'お'], ['か', 'き', 'く'], ['け', 'こ']]

修正版

reducerFunc の第一引数accの第二要素を、(目的のリストになる)第一要素のリストの最後の要素である子リストが含む数値の合計に修正しました。また、acc[i]cur[i] だと分かりにくいので、acccurをアンパックして、各々何の値を保持しているかが分かるような変数に代入しました。

python3

1from functools import reduce 2 3 4def reducerFunc(acc, cur): 5 key_lists, temp_total = acc 6 key, value = cur 7 8 if temp_total >= 5: 9 key_lists.append([key]) 10 temp_total = value 11 else: 12 key_lists[-1].append(key) 13 temp_total += value 14 15 return key_lists, temp_total 16 17 18 19dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 20 21result = reduce(reducerFunc, dic2.items(), ([[]], 0))[0] 22 23print(result) 24 25

出力結果:

[['あ', 'い'], ['う', 'え', 'お'], ['か', 'き', 'く'], ['け', 'こ']]

投稿2021/11/25 10:57

編集2021/11/25 12:57
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

リスト内包表記と代入演算子を使用して

Python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 2 3j = k = 0 4ans = [(k:=i+1) and list(dic2.keys())[j:i+1] for i in range(len(dic2)) if sum(list(dic2.values())[k:i+1]) >= 5 and (j:=k)+1] 5print(ans) # [['あ', 'い'], ['う', 'え', 'お'], ['か', 'き', 'く'], ['け', 'こ']]

投稿2021/11/25 15:25

lehshell

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下です。

python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 2 3result = [] 4keylist = [] 5total = 0 6for key, value in dic2.items(): 7 total += value 8 keylist.append(key) 9 if total >= 5: 10 result.append(keylist) 11 keylist = [] 12 total = 0 13

実行結果

python

1>>> print(result) 2[['あ', 'い'], ['う', 'え', 'お'], ['か', 'き', 'く'], ['け', 'こ']]

投稿2021/11/25 10:45

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

これでどうですか?

python

1dic2 = {"あ":2,"い":3,"う":1,"え":3,"お":3,"か":2,"き":1,"く":2,"け":2,"こ":3} 2li = [] 3n = 0 4a = [] 5for key in dic2: 6 n += dic2[key] 7 a.append(key) 8 if n >= 5: 9 li.append(a) 10 n = 0 11 a = [] 12print(li)

投稿2021/11/25 10:38

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問