2011-12-29 5 views
3

私は、リストと変更値のリストを調べるプログラムを書くためにPythonを使用しています。リストのリスト:全体を通して値を見つける

私のリストに私は3つあり、そのインデックスを探したいと思います。今は最初の行でしか動かすことができません。私はそれが "数字"のリストのどれかで3を見つけることを望みます。ここで

は泥を洗い流すためにいくつかのサンプルコードです:

numbers = [ 
    [3, 3, 3, 5, 3, 3, 3, 3, 6], 
    [8, 0, 0, 0, 4, 7, 5, 0, 3], 
    [0, 5, 0, 0, 0, 3, 0, 0, 0], 
    [0, 7, 0, 8, 0, 0, 0, 0, 9], 
    [0, 0, 0, 0, 1, 0, 0, 0, 0], 
    [9, 0, 0, 0, 0, 4, 0, 2, 0], 
    [0, 0, 0, 9, 0, 0, 0, 1, 0], 
    [7, 0, 8, 3, 2, 0, 0, 0, 5], 
    [3, 0, 0, 0, 0, 8, 0, 0, 0], 
    ] 
a = -1 
while a: 
    try: 
     for row in numbers: 
      a = row[a+1:].index(3) + a + 1 
      print("Found 3 at index", a) 
    except ValueError: 
     break 

私はそれを実行すると、私が手:

Found 3 at index 0 
Found 3 at index 1 
Found 3 at index 2 
Found 3 at index 4 
Found 3 at index 5 
Found 3 at index 6 
Found 3 at index 8 

それが唯一の最初の行に取り組んでいることを示しています。

ありがとうございます!

+0

を行うためにscipyのダウンロード/ numpyのを使用してみてください、あなたが '3'または '0'を見つけたいですか?その行のスライスの目的は何ですか? – moooeeeep

+0

"働いている"ことが何を意味するか分かりません。あなたのコードは間違いなく最初の行以上のものを調べていますが、おそらくあなたが望む方法ではありません。 Pythonが何をしているのかを知るために、あなたのコードを手作業で(鉛筆と紙を使って)作業してください。 'a'の値を注意深く追跡してください。 –

+0

私が「働く」という意味は、最初の行で「行うべきことをする」ことだけです。それは最も確かにリストのリスト全体を見ていない。 – cbbcbail

答えて

2

は、ここであなたが始めるために少しのコードスニペットです:

>>> for i, row in enumerate(numbers): 
     if 3 in row: 
      print i, row.index(3) 

1 8 
2 5 
7 3 
8 0 

>>> numbers[1][8] 
3 
>>> numbers[2][5] 
3 
>>> numbers[7][3] 
3 
>>> numbers[8][0] 
3 
+0

私はこれをやっている間に何かを学び、学びたいと思っています。あなたのコードを説明していただけますか? – cbbcbail

+0

どの部分があなたには分かりませんか? –

+0

各パーツのしくみとその理由を説明してくださいありがとう! – cbbcbail

2

あなただけの行のインデックスを取得したい場合は、in[docs]を使用してオーバーnumbersenumerate[docs]を使用して反復して3がリストにあるかどうかをテスト:行と列のインデックスの

for index, row in enumerate(numbers): 
    if 3 in row: 
     print "3 found in row %i" % index 

、両方のリストを反復処理:

あなただけの新しいリスト内のインデックスを取得したい場合は
for index, row in enumerate(numbers): 
    for col, value in enumerate(row): 
     if value == 3: 
      print "3 found in row %i at position %i" % (index, col) 

、あなたはlist comprehension [docs]使用することができます。

indexes = [(row, col) for row, r in enumerate(numbers) for col, val in enumerate(r) if val == 3] 
+0

私はこれをやっている間に何かを学び、学びたいと思っています。あなたのコードを説明していただけますか? – cbbcbail

+0

対応する文書にリンクしました。私はそれを読むことを提案します、それは非常によく説明されています。 –

+0

ありがとう、私は読むでしょう! – cbbcbail

1

以下を試してください:

[[i for i, v in enumerate(row) if v == 3] for row in numbers] 

これは内部リスト内の各エントリは、元のリストから対応する行3の指標であるリストのリストになります:

[[], [8], [5], [], [], [], [], [3], [0]] 

あなたは3を探していたが、あなたのコードは0を探しているようだが、これは好きですか?

あなたはこのようにそれを使用することができます。

threes = [[i for i, v in enumerate(row) if v == 3] for row in numbers] 
for row, indices in enumerate(threes): 
    for col in indices: 
     print "3 found in row %d, column %d" % (row, col) 
+0

私が探しているものではありません。私はそれがすべての行を実行することを除いて、私は "行"のために実行しているコードを実行する方法が欲しいです。 – cbbcbail

+0

@cbbcbail - 結果をどのように使用するかを示すmy editを参照してください。 –

+0

入れ子にされた理解のために+1しました。 cbbcbail、それは@ F.Jの最初の解答を解読する努力の価値がある。 – Droogans

1

代わりの情報を表示する、のは実際に与えられるデータ構造を構築しましょう私たちはすべての "座標"を3

x = [ 
    (r, c) 
    for r, row in enumerate(numbers) 
    for c, cell in enumerate(row) 
    if cell == 3 
] 

私たちは簡単にそれを確認します。

assert(all(numbers[r][c] == 3 for r, c in x)) 

しかし、あなたは値を置き換えたい場合は、それがこのリストを構築し、手動で後ろに行くとものを置き換えるためにそれを使用しようとする愚かです。希望の出力を直接生成するだけでなく、よりクリーンな方法。つまり、 "値がNone(つまり、引数のために、対応する元の値が3であればリスト、それ以外の場合は元の値)というリストです。"

[[None if cell == 3 else cell for cell in row] for row in numbers] 
0

のように綴られています

この

import scipy as sp 
matrix = your_matrix #write your matrix here. I left it. 
x,y = sp.where(matrix == 3) 
for i in range(len(x)): 
    print x[i],y[i] 
関連する問題