在python中查找列表列表的所有索引

时间:2015-11-24 13:46:18

标签: python list indexing

我搜索了论坛并尝试了几个答案,但它似乎对我不起作用。

所以我的问题是我每次运行程序时都有一个列表,列表中有0和'M'在不同的位置。“M”的位置是随机的。

所以我想得到“M”在列表中所有位置的索引。

我试过这个:

hiddenfield =  [[0, 0, 0, 0, 0, 'M', 0, 0, 0, 'M'],
                [0, 0, 0, 0, 0, 'M', 0, 'M', 'M', 'M'],
                [0, 0, 'M', 0, 'M', 0, 0, 'M', 0, 'M'],
                [0, 0, 0, 0, 'M', 0, 0, 0, 0, 0],
                [0, 0, 'M', 0, 'M', 0, 0, 0, 0, 0],
                [0, 0, 0, 'M', 0, 'M', 'M', 0, 0, 0],
                [0, 0, 0, 'M', 0, 0, 0, 'M', 0, 0],
                [0, 0, 0, 'M', 0, 0, 0, 0, 0, 0],
                [0, 'M', 'M', 0, 'M', 0, 0, 0, 0, 0],
                ['M', 0, 0, 'M', 0, 0, 0, 0, 'M', 0]] 

position_of_m = []

for i in hiddenfield:
        position_of_m.append(i.index('M'))
print(position_of_m)

并且我得到的是所有列表的第一个索引,如下所示:

[5, 5, 2, 4, 2, 3, 3, 3, 1, 0]

我该如何解决这个问题?

编辑:

好的,所以我早些时候得到了一些帮助。但是现在我正在敲打桌子。

代码有点'有点'。但我不希望列表的最后一个数字添加到另一个列表的第一个数字。我很难解释所以我会告诉你更进一步!

继承人代码:

hiddenfield =  [[0, 0, 0, 0, 0, 'M', 0, 0, 0, 'M'],
            [0, 0, 0, 'M', 0, 0, 0, 'M', 'M', 'M'],
            [0, 0, 'M', 0, 'M', 0, 0, 'M', 0, 'M'],
            [0, 0, 0, 0, 'M', 0, 0, 0, 0, 0],
            [0, 0, 'M', 0, 'M', 0, 0, 0, 0, 0],
            [0, 0, 0, 'M', 0, 'M', 'M', 0, 0, 0],
            ['M', 0, 0, 'M', 0, 0, 0, 'M', 0, 0],
            [0, 0, 0, 'M', 0, 0, 0, 0, 0, 0],
            [0, 'M', 'M', 0, 'M', 0, 0, 0, 0, 'M'],
            ['M', 0, 0, 'M', 0, 0, 0, 0, 'M', 0]] 



def update_numbers(x, y, hiddenfield):
try:
    if hiddenfield[x][y] != 'M':
        hiddenfield[x][y] += 1
except IndexError:
    pass

def numbersinhiddefield(indexes):
indexes = [[i,j] for i,row in enumerate(indexes) for j,elem in enumerate(row) if elem == 'M']
loop = 0
while loop < len(indexes):
    update_numbers(indexes[loop][0]+1,indexes[loop][1], hiddenfield)
    update_numbers(indexes[loop][0]-1,indexes[loop][1], hiddenfield)
    update_numbers(indexes[loop][0],indexes[loop][1]+1, hiddenfield)
    update_numbers(indexes[loop][0],indexes[loop][1]-1, hiddenfield)
    update_numbers(indexes[loop][0]+1,indexes[loop][1]+1, hiddenfield)
    update_numbers(indexes[loop][0]-1,indexes[loop][1]-1, hiddenfield)
    update_numbers(indexes[loop][0]+1,indexes[loop][1]-1, hiddenfield)
    update_numbers(indexes[loop][0]-1,indexes[loop][1]+1, hiddenfield)
    loop += 1


def showMineFieldHidden(hiddenfield):
border = list(range(0,len(hiddenfield)))
row = [' ']+border
i = 0
for rows in [border]+hiddenfield:
    print(row[i], end=' ')
    i += 1
    for lines in rows:
        print(lines, end=' ')
    print()

numbersinhiddefield(hiddenfield)

showMineFieldHidden(hiddenfield)

但我得出的不仅仅是正确的:

  0 1 2 3 4 5 6 7 8 9 
0 0 0 1 1 2 M 2 2 4 M 
1 0 1 2 M 3 2 3 M M M 
2 0 1 M 4 M 2 2 M 5 M 
3 0 2 2 5 M 3 1 1 2 1 
4 0 1 M 4 M 4 2 1 0 0 
5 1 2 3 M 4 M M 2 1 1 
6 M 1 3 M 4 2 3 M 1 1 
7 2 3 4 M 3 1 1 1 2 2 
8 2 M M 4 M 1 0 1 2 M 
9 M 3 3 M 3 2 1 1 M 4 <-- this is supposed to be a 2.
            ^
            this is supposed to be a 1 and the one next to it a zero

我认为它是从边界添加到较低的列表?

非常感谢som的帮助!

2 个答案:

答案 0 :(得分:0)

[(i,j) for i,row in enumerate(hiddenfield) for j,elem in enumerate(row) if elem == 'M']

答案 1 :(得分:0)

m = []

for i in hiddenfield:
    start = 0
    for _ in range(i.count('M')):
        k = i.index('M',start)
        m.append(k)
        start = k