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

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

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

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

Q&A

解決済

4回答

2960閲覧

辞書の配列から二次元配列を生成したい

k0908

総合スコア102

Python

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

0グッド

0クリップ

投稿2018/05/17 10:01

辞書の配列から二次元配列を生成したい。

data=[{'A':'A','S':'apple','W':'NY'},{'A':'B','S':'windows','W':'CF'},{'A':'B','S':'Lenovo','W':'CH'},{'A':'A','S':'summung','W':'KL'}]

という配列がある。
この配列を

ans=[[['A','A'],['S','apple'],['W','NY']],[['A','B'],['S','windows'],['W','CF']],[['A','B'],['S','Lenovo'],['W','CH']],[['A','A'],['S','summung'],['W','KL']]]

という二次元配列にしたい。

for d in range(len(data)): ky = data[d].keys() vl = data[d].values() total = [] ans=[] for i in range(len(ky)): itm=[ky[i],vl[i]] total.append(itm) ans.append(total)

とコードを書いた。このコードを実行すると、

itm=[ky[i],vl[i]] TypeError: 'dict_keys' object does not support indexing

とエラーが出た。

for文を使いながら辞書のキーを指定する方法がわからなかった。
どのようにコードを修正すればいいか?

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

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

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

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

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

guest

回答4

0

ベストアンサー

python

1data=[{'A':'A','S':'apple','W':'NY'},{'A':'B','S':'windows','W':'CF'}, 2 {'A':'B','S':'Lenovo','W':'CH'},{'A':'A','S':'summung','W':'KL'}] 3 4result = [] 5for dict_ele in data: 6 result.append([]) 7 for key, value in dict_ele.items(): 8 result[-1].append([key, value]) 9print(result)

itemsを使ってforをすればkeyとvalueを取り出せるので、やりやすいです。

順序合わせたい場合

python

1result = [] 2for dict_ele in data: 3 result.append([]) 4 for key in ["A", "S", "W"]: 5 result[-1].append([key, dict_ele[key]]) 6print(result)

投稿2018/05/17 10:32

編集2018/05/17 10:45
puroko3

総合スコア185

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

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

0

順番が不定でよいなら、一応こんな方法も有ります。

Python

1ans = [list(map(list, d.items())) for d in data]

投稿2018/05/17 11:23

magichan

総合スコア15898

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

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

0

キーが事前にわかっているなら、内包表記1行で書けます。

python

1from pprint import pprint 2 3data=[{'A':'A','S':'apple','W':'NY'},{'A':'B','S':'windows','W':'CF'},{'A':'B','S':'Lenovo','W':'CH'},{'A':'A','S':'summung','W':'KL'}] 4 5ans = [[[k,d[k]] for k in ["A", "S", "W"]] for d in data] 6pprint(ans) 7""" => 8[[['A', 'A'], ['S', 'apple'], ['W', 'NY']], 9 [['A', 'B'], ['S', 'windows'], ['W', 'CF']], 10 [['A', 'B'], ['S', 'Lenovo'], ['W', 'CH']], 11 [['A', 'A'], ['S', 'summung'], ['W', 'KL']]] 12"""

これは3次元のリストです(敢えて言えば)。
ネストを深くしてもアクセスに余計な手間がかかるだけなので、最初から0番目の要素は"A"キーに対応・・・という風に決めてしまった方がラクでしょう。

python

1ans = [[d[k] for k in ["A", "S", "W"]] for d in data] 2pprint(ans) 3 4""" => 5[['A', 'apple', 'NY'], 6 ['B', 'windows', 'CF'], 7 ['B', 'Lenovo', 'CH'], 8 ['A', 'summung', 'KL']] 9"""

ans[0][0]でアクセスできてラクですが、冷静に考えたら元のもdata[0]["A"]でアクセスできるので、何が良いのかよくわからないことになりました。何がしたかったんでしたっけ。

投稿2018/05/17 11:13

編集2018/05/17 11:14
hayataka2049

総合スコア30933

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

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

0

items()メソッドは、辞書のキーと値のタプルのリストを作るので、そちらを使った方がよい。
なお、イテラブルなオブジェクトをインデクシングするには、list()でリスト化するとよい。

投稿2018/05/17 10:13

Lhankor_Mhy

総合スコア35865

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問