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

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

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

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

Q&A

解決済

2回答

8508閲覧

一次元配列を二次元配列に変換したい

kaitotokai

総合スコア59

Python

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

0グッド

1クリップ

投稿2018/04/26 02:00

編集2018/04/26 03:58

前提・実現したいこと

配列arrayが

[["100","150","140","120","130","110"],["2","4","3","5"]]

とあり、
この配列を

[[["100","140","130"],["150","120","110"]],[["2","3"],["4","5"]]

のように変形したい。

該当のソースコード

li = [] for i in range(len(array)): num += 1 if num %2 ==0: #この先がわからない

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

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

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

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

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

fuzzball

2018/04/26 02:53

元データの内側のキーは 0, 1 の二つで固定なのでしょうか?
fuzzball

2018/04/26 02:59

なぜ辞書なのでしょう?配列/リストには出来ないのでしょうか? {0:"100",1:"120"} → [100, 120] など。
kaitotokai

2018/04/26 03:39

元のデータ型がそうだからです
kaitotokai

2018/04/26 03:39

配列/リストには元のデータを変形すればできます
fuzzball

2018/04/26 03:47

質問とは直接関係なく、ちょっと気になっただけですので‥。
guest

回答2

0

python

1#初期化部分はループの外に出す 2if i not in dct: 3 dct[i] = [[], []] #二次元配列で初期化 4 5#追加 6for key, value in d.items(): 7 dct[i][key].append(v[key]) #内側の配列に追加

こんな感じかな。雰囲気ぐらいは伝わるかとw
ダメだったら試行錯誤してみて下さい。

投稿2018/04/26 03:57

fuzzball

総合スコア16731

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

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

fuzzball

2018/04/26 04:01

編集前の質問に対する回答です。念のため。
kaitotokai

2018/04/26 05:38

答えてくださりありがとうございました!!
guest

0

ベストアンサー

サードパーティモジュールmore-itertoolsを使うと楽で、しかも柔軟です。

Python

1from more_itertools import distribute 2 3src = [["100", "150", "140", "120", "130", "110"], ["2", "4", "3", "5"]] 4dst = [[list(e) for e in distribute(2, row)] for row in src] 5 6print(dst) 7# => [[['100', '140', '130'], ['150', '120', '110']], [['2', '3'], ['4', '5']]]

標準機能だけで書くなら、こんな感じでしょうか。

Python

1src = [["100", "150", "140", "120", "130", "110"], ["2", "4", "3", "5"]] 2dst = [ 3 [row[0::2], row[1::2]] for row in src 4] 5 6print(dst)

ついでに

編集前の質問については、こんな感じで書けそう。

Python

1from collections import defaultdict 2 3src = { 4 "a1_0": {0: "100", 1: "120"}, "a1_1": {0: "150", 1: "130"}, "a1_2": {0: "140",1: "110"}, 5 "b1_0": {0: "2", 1: "3"}, "b1_1": {0: "4", 1: "5"}, 6 "c1_0": {0: "90", 1: "80"}, "c1_1": {0: "40", 1: "50"} 7} 8 9dst = defaultdict(list) 10for key, value in src.items(): 11 dst[key[:2]].append( 12 [value[k] for k in sorted(value)] 13 ) 14 15for key, value in dst.items(): 16 dst[key] = list(zip(*value))

投稿2018/04/26 04:10

編集2018/04/26 04:18
LouiS0616

総合スコア35660

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

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

kaitotokai

2018/04/26 04:57

ありがとうございます。ちなみに、編集前の質問に関してですが、"100"・"120"などの子辞書のバリューにnanがあった時、nanを1に置換するにはどうコードが書けますか? dst[key[:2]].append([value[k] if value[k] is not 'nan' else 1 for k in sorted(value)])
kaitotokai

2018/04/26 04:58

と書いたのですが、nanは結局置換されなくて。。。
LouiS0616

2018/04/26 05:11

is not じゃなくて != で比較してみたらどうなります?
kaitotokai

2018/04/26 05:12

!=でも変わらないです
LouiS0616

2018/04/26 05:15

nanは間違いなく文字列ですか? 文字列だとしても、NaNだったりNanだったりしませんか?
kaitotokai

2018/04/26 05:18

[nan, 1] のように入っているので、nanだとは思うのですが...
LouiS0616

2018/04/26 05:21

type関数に放り込んで型を調べてみてください。
kaitotokai

2018/04/26 05:26

nanは<class 'float'>と出ました。
kaitotokai

2018/04/26 05:27

nanってfloatなんですか...?
LouiS0616

2018/04/26 05:30

不定値を表すものですね。nanのほかにinfもあります。 条件部を value[k] is not np.nan あるいは not math.isnan(value[k]) にすれば良いかと思います。
kaitotokai

2018/04/26 05:38

ありがとうございます。value[k] is not np.nanでできました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問