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

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

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

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

Q&A

解決済

3回答

236閲覧

python3 2次元リスト 複数 インデックス

zeitaku_fire

総合スコア26

Python 3.x

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

0グッド

0クリップ

投稿2018/07/04 19:35

python

1li=[[1,1,1,1],[2,2, 5,2],[100, 1, 0, 2,]] 2ans=[] 3for line_1,lis in enumerate(li): 4 for line_2,ind in enumerate(lis): 5 if ind ==2: 6 ans.append([line_1,line_2]) 7print(ans) #[[1, 0], [1, 1], [1, 3], [2, 3]]

2次元リストから、2のインデックスを取得しています。
下記を内包表記とするには、どうしたらいいでしょうか?

python

1 for line_2,ind in enumerate(lis): 2 if ind ==2: 3 ans.append([line_1,line_2])

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

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

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

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

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

guest

回答3

0

python

1li=[[1, 1, 1, 1], 2 [2, 2, 5, 2], 3 [100, 1, 0, 2]] 4 5ans = [[i,j] 6 for i,line in enumerate(li) 7 for j, n in enumerate(line) 8 if n == 2] 9 10print(ans) # => [[1, 0], [1, 1], [1, 3], [2, 3]]

基本的な考え方は、最初の式以外のforifは普通のループと同じ順番で並んでいるということです。

とはいえ、ドキュメントや解説ページを見たり、自分で色々書き換えて動かしてみないと何をやっているのかよくわからないと思います。この書き方でどんどん深くしていくのは避けるべき作法とされています。実際、この形でforが2つのコードはたまに見かけますが、3つ以上は(ネタとして書かれたコード以外では)見たことがありません。

参考:
5. データ構造 — Python 3.6.5 ドキュメント - 5.1.3. リストの内包表記
Pythonでリストの内包表記を使って2次元リストを1次元リストにする - こんにちはこんにちはmonmonです!

投稿2018/07/04 20:16

hayataka2049

総合スコア30933

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

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

zeitaku_fire

2018/07/04 20:56

ありがとうございます。 参考のURL拝見しました。 疑問に思っていた点は、ドキュメントで解消できました。お手数おかけいたしました。
guest

0

ベストアンサー

下記を内包表記とするには、どうしたらいいでしょうか?

Python

1ans = [ 2 [line_1, line_2] 3 for line_1, row in enumerate(li) 4 for line_2, elm in enumerate(row) 5 if elm == 2 6]

ただ、さすがにこれは読みづらいので、適当に処理を分けた方が良いです。


こんな感じに組んでみても面白いかもしれませんね。

Python

1lst = [[1, 1, 1, 1], [2, 2, 5, 2], [100, [1, 2, 4], 0, 2], 2] 2print(lst) 3 4def _recursive_enumerate_inner(src, indice): 5 if isinstance(src, (list, tuple)): 6 for i, inner in enumerate(src): 7 yield from _recursive_enumerate_inner(inner, indice + [i]) 8 else: 9 yield indice, src 10 11def recursive_enumerate(src): 12 yield from _recursive_enumerate_inner(src, []) 13 14def recursive_index(src, purpose): 15 return ( 16 indice 17 for indice, elem in recursive_enumerate(src) 18 if elem == purpose 19 ) 20 21purpose = 2 22for ans in recursive_index(lst, purpose): 23 print(f'{purpose} at {ans}.')

実行結果 Wandbox

plain

1[[1, 1, 1, 1], [2, 2, 5, 2], [100, [1, 2, 4], 0, 2], 2] 22 at [1, 0]. 32 at [1, 1]. 42 at [1, 3]. 52 at [2, 1, 1]. 62 at [2, 3]. 72 at [3].

投稿2018/07/04 20:04

編集2018/07/04 20:33
LouiS0616

総合スコア35660

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

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

zeitaku_fire

2018/07/04 20:53

ありがとうございます。 疑問解決しました。 defの使い方は、まだまだなので、頂いたコード参考にさせて頂きます。
guest

0

Numpy使って遊んでみました。

python

1import numpy as np 2 3li = np.array([[1,1,1,1],[2,2, 5,2],[100, 1, 0, 2,]]) 4 5 6x = np.where(li==2)[0] 7y = np.where(li==2)[1] 8 9ans = [[a, b] for a, b in zip(x, y)] 10print(ans) 11""" 12[[1, 0], [1, 1], [1, 3], [2, 3]] 13"""

投稿2018/07/04 20:49

wakame

総合スコア1170

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

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

zeitaku_fire

2018/07/04 20:58

numpyでの解答ありがとうございます。 2次元リストを扱うなら、numpyが高速で良い。 というのを見たことあるのですが、実際には全然使ったことがなくて、頂いたコード参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問