前提・実現したいこと
複数ある配列を並列的(正しい言葉かわかりません)に一つの配列に変換する関数を実装したいです。
前提と期待する結果
#縦横可変長 a = [1,5] b = [2,6,8] c = [3,] d = [4,7,9,10] 結果 answer=[1,2,3,4,5,6,7,8,9,10]
試したこと
配列自体可変長であり、変数の個数も可変長であるのに事前に数字で書いてしまい、実装も調べてもわかりませんでした。
lst=[] def sol(*lsts): lstsif len(a) > 0 and len(b)> 0 and len(c) > 0 and len(d) > 0: lst.append(a) lst.append(b) lst.append(c) lst.append(d)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
短く書くと
python
1>>> a = [1,5] 2>>> b = [2,6,8] 3>>> c = [3,] 4>>> d = [4,7,9,10] 5>>> x = [a, b, c, d] 6>>> [lst[j:j+1][0] for j in range(max([len(i) for i in x])) for lst in x if lst[j:j+1]!=[]] 7[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
分解して書くと
python
1>>> a = [1,5] 2>>> b = [2,6,8] 3>>> c = [3,] 4>>> d = [4,7,9,10] 5>>> x = [a, b, c, d] 6>>> maxlen = max([len(i) for i in x]) 7>>> print(maxlen) 84 9>>> templist = [lst[j:j+1] for j in range(maxlen) for lst in x] 10>>> print(templist) 11[[1], [2], [3], [4], [5], [6], [], [7], [], [8], [], [9], [], [], [], [10]] 12>>> result = [lst2[0] for lst2 in templist if lst2!=[]] 13>>> print(result) 14[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
投稿2020/12/24 22:28
編集2020/12/24 22:40総合スコア24670
0
他の回答と似ているが、ちょっと違う発想で。
p.py
python3
1a = [1,5] 2b = [2,6,8] 3c = [3,] 4d = [4,7,9,10] 5z = [a, b, c, d] 6 7w = max(list(map(lambda v: len(v), z))) 8h = len(z) 9ans = list(filter(lambda x: x, 10 [z[y][x] if x < len(z[y]) else None for x in range(w) for y in range(h)]) 11 ) 12print(ans) 13 14print() 15print([z[y][x] if x < len(z[y]) else None for x in range(w) for y in range(h)])
2次元配列を1次元配列で表現をして処理しています。( Array[x][y] は v[x * width * y] に相当する)
2 次元配列に対して、 a, b, c, d を 縦方向に代入していきます。
最後に None のものを削除します。
2行目の出力は None を取除く前の状態です。
追記:
2次元行列に
横方向に詰めていく方法2つと
縦に詰めていく方法1つを並べてみました。
(コメントでもらったように、 None 代入を外しています)
p.py
python3
1a = [1, 5] 2b = [2, 6, 8] 3c = [3] 4d = [4, 7, 9, 10] 5z = [a, b, c, d] 6 7w = max(list(map(lambda v: len(v), z))) 8h = len(z) 9 10ans = [x for v in z for x in v] 11print(ans) 12ans = [z[y][x] for y in range(h) for x in range(w) if x <len(z[y])] 13print(ans) 14 15print() 16 17ans = [z[y][x] for x in range(w) for y in range(h) if x < len(z[y])] 18print(ans)
投稿2020/12/26 01:05
編集2020/12/27 00:54総合スコア22324
0
リストにNone
が含まれてないことを前提で。
Python
1import itertools 2 3a = [1,5] 4b = [2,6,8] 5c = [3,] 6d = [4,7,9,10] 7 8ans = list(filter(lambda x: x is not None, 9 itertools.chain.from_iterable(itertools.zip_longest(a,b,c,d)))) 10 11print(ans) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
投稿2020/12/24 16:29
総合スコア85901
0
質問者さんのやりたいことはMapReduceかと思います。
並列処理は一台のマシンのマルチスレッド処理でしょうか?それとも複数台のマシンで分散処理したいのでしょうか?
どちらなのかによってやり方は少し変わります。
一台のマシンで上で並列処理したいなら、整列コレクションを探してreduceという関数を使いましょう。
分散処理をしたい場合は、分散処理用のフレームワークの導入を検討すると良いです。有名なところではHadoopやApache Sparkがあります。
知らない言葉がたくさん出てきたかと思いますが、遠回りのように見えても一つ一つ調べて理解していくほうが、最終的には早く解決できます。
投稿2020/12/24 18:04
総合スコア874
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/25 01:50
2020/12/25 02:01 編集
2020/12/25 04:11
2020/12/25 04:34