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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

621閲覧

<python3>辞書型配列のvalueの操作についての質問

FoiFoi

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/01/30 13:38

編集2019/01/30 13:41

前提・実現したいこと

#現状の辞書型配列

dict = {0: ['s', 'b', 'd', 't'], 1: ['s', 'a', 'c', 't'], 2: ['s', 'b', 'c'], 3: ['s', 'a', 'c']}

#最終的に表現したい辞書型配列

new_dict = {0: [['s', 'b'], ['b', 'd'], ['d', 't']], 1: [['s', 'a'], ['a', 'c'], ['c', 't']], 2: [['s', 'b'], ['b', 'c']], 3: [['s', 'a'], ['a', 'c']]}

上記のようにdictという辞書型配列のvalueに関して、それぞれ連続する右隣の文字列とでリストを形成し、それぞれのkeyのvalueを二重配列に改変したいです。

その方法についてご教示頂けたらと存じます!

python

1#現状の辞書型配列 2dict = {0: ['s', 'b', 'd', 't'], 1: ['s', 'a', 'c', 't'], 2: ['s', 'b', 'c'], 3: ['s', 'a', 'c']} 3 4 5#実現したい辞書型配列 6new_dict = {0: [['s', 'b'], ['b', 'd'], ['d', 't']], 1: [['s', 'a'], ['a', 'c'], ['c', 't']], 2: [['s', 'b'], ['b', 'c']], 3: [['s', 'a'], ['a', 'c']]} 7

試したこと

[['s', 'b'],
['b', 'd'],
['d', 't'],
['s', 'a'],
['a', 'c'],
['c', 't'],
['s', 'b'],
['b', 'c'],
['s', 'a'],
['a', 'c']]
このようにペアを作り、
⑴分割し、valueごとのリストを作成し
⑵keyとzipする
と手順は考えていたのですが、まず⑴でつまずいてしまいました。

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

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

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

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

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

guest

回答3

0

参考までに、痒いところに手が届くRubyの例です。

Ruby

1src = {0 => ['s', 'b', 'd', 't'], 1 => ['s', 'a', 'c', 't'], 22 => ['s', 'b', 'c'], 3 => ['s', 'a', 'c']} 3 4dst = src.transform_values{|x| x.each_cons(2).to_a}

quiquiさんの紹介されているpairwise相当がeach_cons(2)です。

投稿2019/01/30 14:57

otn

総合スコア84677

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

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

FoiFoi

2019/01/30 15:18

素晴らしくスマートに表現することができるんですね、共有頂きありがとうございます!
quickquip

2019/01/31 00:31

高速に動作する必要があるものだけitertoolsで用意しておいて、その組み合わせでどうにかなるものは自分で書け(あるいはレシピに書いておくからそれを使え)がPythonの思想なのですよね……。 レシピに書いてある基本的な作用ぐらいサブパッケージにでも入れておいてくれればいいのにとよく思います。 ちなみに each_cons(n) は Pythonだと zip(*starmap(islice, zip(tee(seq, n), count(0), repeat(None)))) が簡潔(?)かつ最速だと思います。
guest

0

Python公式ドキュメントのitertoolosのレシピに、pairwiseという関数が例として書いてあります。

>>> from itertools import tee >>> def pairwise(iterable): ... "s -> (s0,s1), (s1,s2), (s2, s3), ..." ... a, b = tee(iterable) ... next(b, None) ... return zip(a, b)

と準備したら、(関数はitertoolosのレシピからの引用です)

>>> d = {0: ['s', 'b', 'd', 't'], 1: ['s', 'a', 'c', 't'], 2: ['s', 'b', 'c'], 3: ['s', 'a', 'c']} >>> new_dict = {k: list(pairwise(v)) for k, v in d.items()} >>> new_dict {0: [('s', 'b'), ('b', 'd'), ('d', 't')], 1: [('s', 'a'), ('a', 'c'), ('c', 't')], 2: [('s', 'b'), ('b', 'c')], 3: [('s', 'a'), ('a', 'c')]}

でほぼ欲しいものになってると思います。(変数名dictは標準ライブラリの辞書の型名を隠してしまうのでやめましょう)

タプルなのがどうしても嫌なら、

>>> new_dict = {k: list(map(list, pairwise(v))) for k, v in d.items()} >>> new_dict {0: [['s', 'b'], ['b', 'd'], ['d', 't']], 1: [['s', 'a'], ['a', 'c'], ['c', 't']], 2: [['s', 'b'], ['b', 'c']], 3: [['s', 'a'], ['a', 'c']]}

で。

投稿2019/01/30 13:51

編集2019/01/30 13:53
quickquip

総合スコア11055

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

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

FoiFoi

2019/01/30 14:21

素晴らしい回答ありがとうございます。 ただ今回私が理想としていたのが、モジュールを使わない形での表現方法だったので申し訳ございません。 しかし今後の参考にさせて頂きます! > 変数名dictは標準ライブラリの辞書の型名を隠してしまうのでやめましょう ありがとうございます、ローカルで定義していた変数名があまりにヘンテコだったので単純にdictと定義してしまいました。アドバイス頂きありがとうございます。
guest

0

ベストアンサー

面白そうだったので書いてみました。

Python

1src = {0: ['s', 'b', 'd', 't'], 1: ['s', 'a', 'c', 't'], 2: ['s', 'b', 'c'], 3: ['s', 'a', 'c']} 2 3dst = {} 4for k, v in src.items(): 5 tmp = [] 6 for p in zip(v, v[1:]): 7 p = list(p) 8 tmp.append(p) 9 10 dst[k] = tmp 11 12print(dst)

実行結果 Wandbox

{0: [['s', 'b'], ['b', 'd'], ['d', 't']], 1: [['s', 'a'], ['a', 'c'], ['c', 't']], 2: [['s', 'b'], ['b', 'c']], 3: [['s', 'a'], ['a', 'c']]}

なお、内包表記を使うとこんなふうに書けます。Wandbox

Python

1src = {0: ['s', 'b', 'd', 't'], 1: ['s', 'a', 'c', 't'], 2: ['s', 'b', 'c'], 3: ['s', 'a', 'c']} 2dst = { 3 k: [list(p) for p in zip(v, v[1:])] 4 for k, v in src.items() 5} 6 7print(dst)

投稿2019/01/30 13:50

LouiS0616

総合スコア35660

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

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

FoiFoi

2019/01/30 14:06

内包表記での表現までご教示頂きありがとうございました。 まさに内包表記までのアウトプットこそ理想としていた形でしたので、ベストアンサーとさせて頂きました。 またよろしくお願い致します。
FoiFoi

2019/01/30 15:16

追って失礼します。 for p in zip(v, v[1:]): 上記部分について咀嚼させて頂いてましたが、 素晴らしくスマートで感動いたしました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問