次のリストリストで文字のインデックスを見つけようとしています。
例えば:
>>> alphabet = [[["A","B","C"],["D","E","F"],["G","H","I"]],[["J","K","L"],["M","N","O"],["P","Q","R"]],[["S","T","U"],["V","W","X"],["Y","Z","_"]]]
>>> find("H",alphabet)
(0,2,1)
これを行う最もPython的な方法は何ですか?
次のリストリストで文字のインデックスを見つけようとしています。
例えば:
>>> alphabet = [[["A","B","C"],["D","E","F"],["G","H","I"]],[["J","K","L"],["M","N","O"],["P","Q","R"]],[["S","T","U"],["V","W","X"],["Y","Z","_"]]]
>>> find("H",alphabet)
(0,2,1)
これを行う最もPython的な方法は何ですか?
これをあらゆる深さで処理するソリューションが本当に必要な場合、これは(単純な再帰関数として)探している種類のものです。
def find_recursive(needle, haystack):
for index, item in enumerate(haystack):
if not isinstance(item, str):
try:
path = find_recursive(needle, item)
if path is not None:
return (index, ) + path
except TypeError:
pass
if needle == item:
return index,
return None
編集:覚えておいてください。2.xでは、basestring
Unicode文字列も許可する必要があります。このソリューションは3.xユーザーには問題ありません。
単純にデータ構造を変更して、次を使用できますdict
。
>>> import itertools
>>> import string
>>> lets = string.ascii_uppercase
>>> where = dict(zip(lets, itertools.product(range(3), repeat=3)))
>>> where
{'A': (0, 0, 0), 'C': (0, 0, 2), 'B': (0, 0, 1), 'E': (0, 1, 1), 'D': (0, 1, 0), 'G': (0, 2, 0), 'F': (0, 1, 2), 'I': (0, 2, 2), 'H': (0, 2, 1), 'K': (1, 0, 1), 'J': (1, 0, 0), 'M': (1, 1, 0), 'L': (1, 0, 2), 'O': (1, 1, 2), 'N': (1, 1, 1), 'Q': (1, 2, 1), 'P': (1, 2, 0), 'S': (2, 0, 0), 'R': (1, 2, 2), 'U': (2, 0, 2), 'T': (2, 0, 1), 'W': (2, 1, 1), 'V': (2, 1, 0), 'Y': (2, 2, 0), 'X': (2, 1, 2), 'Z': (2, 2, 1)}
>>> where["H"]
(0, 2, 1)
U
ただし、 to パッドの位置を 2 倍にしないことに注意してください。
>>> where["U"]
(2, 0, 2)
In [9]: def find(val,lis):
ind=[(j,i,k) for j,x in enumerate(lis) for i,y in enumerate(x) \
for k,z in enumerate(y) if z==val]
return ind[0] if ind else None
...:
In [10]: find("H",alphabet)
Out[10]: (0, 2, 1)
In [14]: find("M",alphabet)
Out[14]: (1, 1, 0)