【问题标题】:Is there a letter at this position on the list of lists?列表中的这个位置有字母吗?
【发布时间】:2017-03-15 01:26:07
【问题描述】:

我正在尝试编写一个函数来确定一个字母是否出现在列表列表的特定行和列中。

#Input:

lst2 = [['.', 'W', 'W', 'E', 'E'],
        ['.', '.', '.', '.', 'f'],
        ['A', 'A', 'A', '.', 'f']]

#Output: is_space_occupied(0, 1, lst2) should return True because 'W' is present on that spot 
        while is_space_occupied(1, 1, lst2) should return False because '.' is present on 
        that spot and not a letter.

这是我目前的代码:

def letter_on_spot(row,col,lst):
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
for row in lst:
    for col in lst:
        if col == A:
            return True
        else:
            return False

编辑:我将返回函数作为返回 True 的错误,并且不确定我的函数是否正常工作

【问题讨论】:

  • 那有什么问题?
  • 我的代码不能正常工作并且出现错误我希望有人能看到它可能有什么问题。有人告诉我这可以用 2 个 for 循环和一个 if-else 语句来完成,但无法弄清楚
  • 在您的问题中发布您的错误。
  • 鉴于A的值,你认为col == A在做什么?
  • 我认为我应该将其更改为返回 True 我基本上想说如果该列是一个字母,那么该字母存在于列表中

标签: python list python-3.x position letter


【解决方案1】:

这里有两个问题。

首先,您进行了不必要的循环;您提供列表的索引,因此您只需要检查具有这些索引的值是否包含在字符串A 中。无需为了检查一个元素而遍历每个元素;索引列表lst

其次,col == A 总是会失败(除非col = 'ABCD..yz')。当您应该使用 in 运算符检查 A 是否包含 col 时,您可以比较它们的值。

简而言之,您可以将函数更改为:

def letter_on_spot(row,col,lst):
    A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    return lst[row][col] in A

并根据给定索引的内容获得想要的结果 -- True/False

理想情况下,应该执行一些错误检查,以便现在允许导致IndexErrors 的索引;为此,请使用列表的len,如下所示:

def letter_on_spot(row,col,lst):
    A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
    if row >= len(lst) or col >= len(lst[row]): 
        return False    
    return lst[row][col] in A

在尝试访问lst 之前,通过测试列表lst 的长度和子列表lst[row] 的长度来检查边界是否可以接受。

【讨论】:

  • 谢谢吉姆,这很好用,但是如果字母不在该位置或者是非字母字符,我怎么能让这个函数返回 False
  • 我真的建议使用str.isalpha()。意图可以说是更清楚,而且不可能忘记一个或多个字符。
  • @warrior4223 如果字母不在lst[row][col] 指定的位置,由于in 检查失败,您将返回False。如果是非字母字符?你是说标点符号?
  • @rainer 我同意这一点,但我不想偏离他的代码太多
  • 因此,如果输入是 'is_space_occupied(5, 5, lst2)',该函数是否会返回 False,因为该位置在列表列表中不存在,或者我怎么能让它这样做?我不确定它目前在这种情况下在做什么
【解决方案2】:

letter_on_spot(row, col, lst) 需要两个整数(希望如此)和一个列表作为输入

让我们一步一步来:

for row in lst:

与 lst 中每个较小的列表相同

for col in lst:

与 lst 中每个较小的列表相同 所以这是你的第一个问题;我们要遍历行的元素,而不是 lst

if col == A:

假设我们解决了上述问题,我们是检查 col 是否与 A 相同,还是检查 col 是否 A?

我们可以访问 lst 的元素并检查它是否是一个带有以下内容的字母:

if lst[row][col] in A:
    return True
else:
    return False

【讨论】:

    【解决方案3】:

    我不确定您的代码到底有什么问题,但更简短的替代方法如下:

    def letter_on_spot(row,col,lst):
        return lst2[row][col].isalpha()
    

    【讨论】:

    • 不需要额外的括号或调用str 类的方法。 return lst2[row][col].isalpha() 可以。
    • 谢谢!我修改了!
    【解决方案4】:

    您可以使用索引来访问列表元素:

    x = [10, 11, 12, 13]
    x[1] # => 11
    

    同样适用于列表列表:

    lst2 = [['.', 'W', 'W', 'E', 'E'],
            ['.', '.', '.', '.', 'f'],
            ]
    lst2[2]    # => ['A', 'A', 'A', '.', 'f']
    lst2[2][1] # => 'A' 
    

    现在,您需要做的就是检查符号是否有字符。 Python 为此提供了str.isalpha()

    lst2[0][1].isalpha() # => True
    lst2[1][1].isalpha() # => False
    

    请注意,str.isalpha() 也将返回 True 用于具有多个字符的字符串(例如,"hello".isalpha() 返回 True)。如果担心,只需检查字符串的长度,您可以使用 @ 987654329@.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-27
      • 1970-01-01
      • 2018-04-22
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多