列表清单:始终找到一个值

时间:2011-12-29 22:02:19

标签: python

我正在使用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

这表明它正在工作但仅在第一行。

谢谢!

5 个答案:

答案 0 :(得分:2)

如果您只想获取行索引,请使用enumerate [docs]迭代numbers并使用in [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]

答案 1 :(得分: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

答案 2 :(得分: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)

答案 3 :(得分: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] ”。

这拼写像

{{1}}

答案 4 :(得分:0)

尝试使用scipy / numpy执行此操作

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]