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

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

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

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1294閲覧

listを並列的に追加する

ruizu

総合スコア35

Python 3.x

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

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2020/12/24 15:57

編集2020/12/26 03:34

前提・実現したいこと

複数ある配列を並列的(正しい言葉かわかりません)に一つの配列に変換する関数を実装したいです。

前提と期待する結果

#縦横可変長 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ページで確認できます。

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

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

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

guest

回答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
ppaul

総合スコア24670

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

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

ruizu

2020/12/25 01:50

ありがとうございます! この場合、xの配列を事前に用意していると思うのですが、変数がa,b,c,dだけでなくe,f,gと続く場合どのようにしたらよいでしょうか?
ruizu

2020/12/25 02:01 編集

*argsで受け取って、x=[i for i in args]で用意できました! ありがとうございます!!
ppaul

2020/12/25 04:11

x=[i for i in args] でもできますね。 x=list(args) と書いても同じことができます。 さらにいうと、xはリストのリストでなく、リストのタプルでもよいので、 x=argsとしても同じ結果が出ます。 結局のところ、 def foo(*x): return [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]!=[]] でも動きます。
ruizu

2020/12/25 04:34

なるほど、そんなに簡単に書けるんですね! 勉強になります、丁寧に教えていただきありがとうございますm(_ _*)m
guest

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
katoy

総合スコア22324

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

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

bsdfan

2020/12/26 01:44

あとでfilterで取り除くより、最初からリストに入れないほうがスマートな気がしました。 [z[y][x] for x in range(w) for y in range(h) if x < len(z[y])]
katoy

2020/12/26 04:11

ああ、おっしゃるとおりですね。
guest

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

otn

総合スコア85901

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

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

otn

2020/12/24 16:32

> 複数ある配列を並列的(正しい言葉かわかりません)に一つの配列 zipといいます。(c.f. 服のジッパー=ファスナー) 長さが等しければ、zip関数で。zip([1,2,3],[9.8,7])
guest

0

質問者さんのやりたいことはMapReduceかと思います。
並列処理は一台のマシンのマルチスレッド処理でしょうか?それとも複数台のマシンで分散処理したいのでしょうか?
どちらなのかによってやり方は少し変わります。

一台のマシンで上で並列処理したいなら、整列コレクションを探してreduceという関数を使いましょう。

分散処理をしたい場合は、分散処理用のフレームワークの導入を検討すると良いです。有名なところではHadoopやApache Sparkがあります。

知らない言葉がたくさん出てきたかと思いますが、遠回りのように見えても一つ一つ調べて理解していくほうが、最終的には早く解決できます。

投稿2020/12/24 18:04

rysh

総合スコア874

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問