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

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

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

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

1回答

3279閲覧

多次元配列内の各リストの最初の行のみで、重複しているものを1次元配列として取り出す

goki_gottan

総合スコア168

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2019/01/24 16:51

たとえば、ある多次元リスト内に、[[10×10],[20×20],[30×30],[50×50]]という、
リスト内のリストがそれぞれ行と列数が異なる多次元リストがあったとき、
それぞれの正方配列の最初の行だけの要素を抽出することはできたのですが、
抽出しても、その抽出したものも2次元配列となっており、
たとえば、[[10],[20],[30],[40]] ※10とは要素が10個の意味

この抽出された2次元配列の重複のみの要素を取り出す方法が分からず、
また、取り出した際、1次元配列にしたいです。

教えていただけないでしょうか

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

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

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

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

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

wwbQzhMkhhgEmhU

2019/01/24 20:49

頭悪くて理解できてませんが、 3重にforを入れ子にして、最内で初期状態空の配列にappendしていくとかではダメですか?
goki_gottan

2019/01/25 15:52

appendにすると、それをまとめた配列変数(これをAとする)は、Aの要素(リスト)は、 それぞれ統一性がなく、たとえば、Aの一番目の要素は、2行2列ですが、2番目の要素は5行5列とか・・・ それらの1行目を取り出すことは可能ですが、取り出したリストは たとえば、A’=[[1],[1,2],[3,4,5],[4,5,6,7]]となります。これを他の方が答えてくださりましたが、 まずは1次元にして、A''=[1, 1, 2, 3, 4, 5, 4, 5, 6, 7] A’’を重複があるか調べればいいということになるそうです。 ですので、appendでいいということですね。ありがとうございます。
guest

回答1

0

ベストアンサー

先に1次元化したあとに重複ぶんだけ抽出すると簡単かと思います。

Python

1l = [[1],[1,2],[3,4,5],[4,5,6,7]] 2 3l = [i for li in l for i in li] 4print(l) # [1, 1, 2, 3, 4, 5, 4, 5, 6, 7] 5l = [i for i in l if l.count(i) == 1] 6print(l) # [2, 3, 6, 7]

投稿2019/01/24 23:15

can110

総合スコア38256

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

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

goki_gottan

2019/01/25 15:44

たとえば、要素が2次元(縦、横)の場合でも、カッコは多いですが横一列の1次元にして、それからカッコの中の1番目の要素(2次元でいう1行目)だけをそれぞれカッコのものから抽出し、 l=[[1],[1,2],[3,4,5],[4,5,6,7]]にし、これらをカッコのない1次元にし、重複のない要素を取り出すという感じでしょうか。
goki_gottan

2019/01/25 15:54

回答の意味を理解できました。 ありがとうございます。そのforで1次元にするやり方が知りたかったです。 発想の転換ですね。ありがとうございました。
wwbQzhMkhhgEmhU

2019/01/25 16:50

私が書いたヒントもどきはcan110さんの l = [i for li in l for i in li] のことです。もっとも私が想定したのは、この書き方ではなく、 > A=[] > for i in l: > for j in i: > A.append(j) のような書き方です。Aに入る値がcan110さんのlと同じになります。 どちらも同じことですが、canさんの方がスマートです。 しかも私は3重とか言ってましたが、2重でした。すみません。 なお、canさんの答えは重複した値が消えてしまってますがいいんでしょうか? ぶっちゃけ私は問題の意味がよく分からなかったですけど笑
goki_gottan

2019/01/27 09:56

いえ、すみません。1次元リストまですると、色々とネットに参考サイトがありますので、大丈夫かと思います。最初に1次元にするという発想、できるかどうかもわからなかったので・・・ 1次元にさえすれば簡単です。ありがとうございました。 ここで、さらに質問して申し訳ないのですが、 最初に書いた多次元リストの要素(これもリスト)のある列と行を指定したい場合、 たとえば、a[1][1,2]というようなことができません。これは、要素(リスト)がそれぞれ違う行数と列数だからでしょうか。
wwbQzhMkhhgEmhU

2019/01/27 10:48

多次元というと配列のようなイメージですが、入れ子のリストです。 なので、要素の指定方法としては、当該リスト内での順番でしかありません。 要素数も次元数も固定ではないので、外側から順番に開けてみないと分からないのです。 というわけで、a[1][1][2]という指定方法はできないこともないですが、a[1][1,2]はNGです。 >>> a=[1,[2,[3,4,5]],6] >>> a[1][1][2] 5 >>>
goki_gottan

2019/01/27 11:33

ありがとうございます。ここでご回答いただけるとは・・・ 最後にもう1点きいてよろしいでしょうか。 a=[1,[2,[3,4,5]],6]と、多次元とはいえ、中身は1次元です。 では、その要素に行があると、たとえば、ここで書きにくいのですが、 a=[1,[2行2列,[3行2列]],6行4列]の場合の、 3行2列のリストの要素指定はどうするのでしょうか。 a[1][1][2,1]のようなa[1][1][〇,〇]とならないのでしょうか。
wwbQzhMkhhgEmhU

2019/01/27 12:54

最大次数と最大要素数に合わせて拡張することは難しくはありませんよ。例えば a=[1,[2,[3,4,5]],6] ↓ a=[[[1,0,0],[0,0,0],[0,0,0]],[[2,0,0],[3,4,5],[0,0,0]],[[6,0,0],[0,0,0],[0,0,0]]] 便宜上0を入れていますが。これで[3][3][3]の3次元配列を表現出来ています。 つまり、入れ子のリストは固定長の多次元配列を全て表現可能です。 なのでというわけではありませんが、Pythonに多次元の配列という概念はありません。仕様としては、 https://docs.python.jp/3/reference/datamodel.html を参考にしてください。 先に見たとおり、多次元の配列とは、各次元での要素数を固定にした入れ子のリストで表現できますし、もっと言えば入れ子でないリストでも同一要素数で、(自分でルールさえ決めれば)表現可能です。ただ、言語仕様にないので、言語での添字範囲チェックなどは通常できません。
goki_gottan

2019/01/27 14:42

すみません。理解不足で申し訳ございませんが、「入れ子のリストは固定長の多次元配列を全て表現可能」ということは、私が想っている縦横という概念を横一列という表現に置き換えれるということでしょうか。 ですので、先の質問で、[3][3][3][2]みたいな感じで要素を指定できるということなのでしょうか。
wwbQzhMkhhgEmhU

2019/01/27 15:21

そこは自分で考えてください。私にはあなたの頭の中までは分かりません。 あなたはあなたの頭の中にあることをあなたの言葉で表現しようとしていますが(縦横とかね)、それは誰もが共通にイメージできる言葉ではなく、正確にはPythonという言語仕様で話さないと正確にはならないのです。 およそなんとなくで言えば答えはYESなのですが、自分で考え、見聞を広めることが大事かと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問