【问题标题】:what is the elegant way to check if a nested list has and has NOT a value at a specific index?检查嵌套列表在特定索引处是否有值的优雅方法是什么?
【发布时间】:2018-04-02 04:00:15
【问题描述】:

假设我们有二维数组:

ar = [[1,2],
      [3,4]]

if ar[1][1]:
#works
if not ar[3][4]: 
#breaks!! 

由于我是 python 新手,需要知道什么是优雅的语法。

【问题讨论】:

    标签: python list exception-handling nested-lists


    【解决方案1】:

    如果这是你需要经常做的检查,你可以给自己做一个小辅助函数,这样你的主要代码会更好地流动:

    def has_item_at(items, i, j):
        return i < len(items) and j < len(items[i])
    
    def main():
        items = [[1, 2], [3, 4]]
        if has_item_at(items, 1, 1):
            # do stuff
        if has_item_at(items, 3, 4):
            # don't do stuff
    

    如果您需要检查是否存在并检索该项目,您可以执行以下操作:

    def get_item(items, i, j, default=None):
        if i < len(items) and j < len(items[i]):
            return items[i][j]
        return default
    
    def main():
        items = [[1, 2], [3, 4]]
        item = get_item(items, 1, 1)
        if item is not None:
            # do stuff
    

    【讨论】:

      【解决方案2】:

      Python 深受喜爱的带有异常处理的 EAFP 方法将是我的做法。

      try:
          print(ar[i][j])  # i -> row index, j -> col index
      except IndexError:
          print('Error!')
      

      另一种方法,也称为 LYBL 方法,是使用if 检查:

      if i < len(ar) and j < len(ar[i]):
          print(ar[i][j])
      

      这是“单线”版本(这会降低可读性,但您似乎想要):

      print(ar[i][j] if i < len(ar) and j < len(ar[i]) else "Error")
      

      【讨论】:

      • 这应该在一行中完成 :( 我期待 python 可以向我展示一些力量。
      • @DragonKnight 你的一个班轮:print(ar[i][j] if i &lt; len(ar) and j &lt; len(ar[i]) else "Error") 我不推荐它,它会破坏可读性。
      • 没错,它不可读。我希望if not ar[3][4]: 能优雅地工作。谢谢你们。
      猜你喜欢
      • 1970-01-01
      • 2011-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 2019-09-26
      • 2019-09-18
      • 2010-10-13
      相关资源
      最近更新 更多