使用这些函数,我无法将字符串列表返回到元组和索引。第一个我试图返回每个第一次出现的字母字符串及其索引位置,但到目前为止我只能返回一个带有索引的字符串,我怎样才能使它迭代遍历每个列表并选择最早出现的字符串?
area3 = [['.', '.', '.', 'a'],
['.', 'B', '.', 'a'],
['.', '.', '.', '.'],
['.', 'Y', 'Y', 'Y'],
['.', '.', '.', '.'],
['.', 'x', '.', '.']]
def zone_lists(area):
for row in area:
for letter in row:
if ('A' <= letter <= 'Z' or 'a' <= letter <= 'z'):
return letter, area.index(row), row.index(letter)
zone_lists(area3) # Should return [('a', 0, 3), ('B', 1, 0), ('Y', 3, 1), ('x', 5, 1)]
在这个函数中,它应该返回后面的字符串值'e',但是我得到一个值错误。我不确定递归调用是否正确,有没有办法调用它而不使用枚举等内置函数?
def last_list_val(value,area):
for row in area:
for letter in row:
if value == letter:
return area.index(row[0:-1]), row.index(letter[0:-1]) #Backward call?
last_list_val('Y',area3) #Should return (3,3)
答案 0 :(得分:2)
第一个功能:
area3 = [['.', '.', '.', 'a'],
['.', 'B', '.', 'a'],
['.', '.', '.', '.'],
['.', 'Y', 'Y', 'Y'],
['.', '.', '.', '.'],
['.', 'x', '.', '.']]
def zone_lists(area):
result = []
for i, row in enumerate(area):
for j, letter in enumerate(row):
if letter.isalpha():
result.append((letter, i, j))
break # remove this line if you want to have both 'B' and 'a' from row 1
return result
zone_lists(area3) # Should return [('a', 0, 3), ('B', 1, 0), ('Y', 3, 1), ('x', 5, 1)]
第二个:
def last_list_val(value, area):
for i in range(len(area) - 1, -1, -1):
row = area[i]
for j in range(len(row) - 1, -1, -1):
letter = row[j]
if value == letter:
return i, j
我在第一个函数中使用了enumerate
。但是如果你不喜欢它(或某些原因不能使用它),你总是可以使用旧时尚for i in range(len(area)):
获得指数并使用area[i]
来获取相应的值,比如我在第二个功能中做了(略有不同,因为我反过来做了)。
答案 1 :(得分:1)
这是一个很好的发电机。
考虑:
from string import ascii_letters
def zone_list(area):
for i, sl in enumerate(area):
t=next(((j,e) for j,e in enumerate(sl) if e in ascii_letters), None)
if t:
yield (t[1], i, t[0])
然后测试:
>>> list(zone_list(area3))
[('a', 0, 3), ('B', 1, 1), ('Y', 3, 1), ('x', 5, 1)]
第二个功能变为:
def last_list_val(value,area):
for i, sl in enumerate(area):
seq=[(j,e) for j,e in enumerate(sl) if e==value]
if len(seq)>1:
yield (i, seq[-1][0])
然后:
>>> list(last_list_val('Y', area3))
[(3, 3)]