0

リストのリストで特定の文字が最後に出現した行と列を返す必要がある関数を作成しています。文字がリストのリストにない場合、関数は None を返す必要があります。この関数は、最初に出現したものを無視またはスキップし、最後に出現した行と列を順序付けられたペアとして返します。

Example: 

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

#For this list of lists the function should return (5,3) for Z since it is in the 6th list, 
#and is the 6th value (python starts the count at 0) and for X it should return (3,3)

私の現在のコードは、文字の最初の出現の行と列を見つけますが、最後の出現は見つけないと思います。最初に出現したものを無視し、代わりに最後の行と列を返すように Python に指示するにはどうすればよいでしょうか?

コード:

def get_far_end(symbol,lot):
    for i in range(len(lot)):
        for j in lot[i]:
            if j == symbol:
                return i ,lot[i].index(j)   
4

4 に答える 4

1

最後から開始し、逆方向に移動します。

def get_far_end(symbol,lot):
    for i in range(len(lot)-1,-1,-1):
        for j in range(len(lot[i])-1,-1,-1):
            if lot[i][j] == symbol:
                return i ,j
    return None   
于 2016-11-01T01:49:46.343 に答える
0

各文字の位置が必要な場合は、辞書内包表記で 1 つのライナーを実行できます。

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

res = {c: (i, j) for i, sub in enumerate(lst) for j, c in enumerate(sub) if c != '.'}
print(res)

出力:

{'A': (1, 1), 'X': (3, 3), 'Z': (5, 3), 'e': (2, 3), 'y': (5, 1)}
于 2016-11-01T01:57:49.297 に答える
0

「.」以外の文字に興味があると思います。もしそうなら、次のように辞書を使用してそれを行うことができます:

lst = [['.','.','.','e'],
       ['A','A','.','e'],
       ['.','.','.','e'],
       ['.','X','X','X'],
       ['.','.','.','.'],
       ['.','y','Z','Z']]

out_dict = {}

for i in range(len(lst)):
        for j in range(len(lst[i])):
            if lst[i][j] is not '.':
                out_dict[lst[i][j]] = [i,j]


print(out_dict)
# {'Z': [5, 3], 'y': [5, 1], 'X': [3, 3], 'A': [1, 1], 'e': [2, 3]}
于 2016-11-01T01:47:39.360 に答える