功能:返回列表的字符串和元组?

时间:2016-10-31 20:36:18

标签: python list function python-3.x

使用这些函数,我无法将字符串列表返回到元组和索引。第一个我试图返回每个第一次出现的字母字符串及其索引位置,但到目前为止我只能返回一个带有索引的字符串,我怎样才能使它迭代遍历每个列表并选择最早出现的字符串?

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)

2 个答案:

答案 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)]