【问题标题】:Does python have a built-in get() for list similar to dictionaries?python 是否具有类似于字典的列表的内置 get() ?
【发布时间】:2013-06-10 10:48:36
【问题描述】:

我想从列表中提取一个项目,如果没有找到则返回一个默认值(而不是通常的索引异常)。与字典上的 get(key, default) 非常相似。仔细阅读文档后,感觉我仍然忽略了提供此功能的一个简单的内置 python 解决方案。

这是我能想到的最快速度:

def pluck(list_items, index, default=None):
  return dict(zip(range(len(list_items)), list_items)).get(index, default)

s = [1, 2,]
pluck(s, 3, None)

谢谢!

【问题讨论】:

  • 有一点,您应该阅读enumerate。比zip(range(len....好看多了。
  • 我不知道。您的解决方案应该可以工作,但与这些解决方案之一相比,创建一个新的dict 似乎需要做很多额外的工作。 stackoverflow.com/questions/2574636/…
  • 我认为return list_items[item] if index < len(list_items) else default 是最好的解决方案
  • @rpq:负指数呢?
  • @martineau return list_items[item] if 0 <= item < len(list_items) else default

标签: python


【解决方案1】:

根据您希望尝试访问数组边界之外的频率,您应该捕获异常(如果预期很少发生故障),或者测试索引是否有效,否则返回默认值.

如果预计故障很少见,这可能是最快的解决方案:

def pluck(items, index, defval):
    try:
        return items[index]
    except IndexError:
        return defval

如果预计会频繁,最好检查索引是否有效:

def pluck(items, index, defval):
    return items[index] if -len(items) <= index < len(items) else defval

请注意,如果abs(index) &lt;= len(items),即使用负索引是有效的,即。 items[-1] 等价于items[len(items)-1]。

【讨论】:

【解决方案2】:

如果您只使用正索引,为了让它真正快速和简单:

seq, i = [1, 2, 3], 2
plucked = seq[i] if seq[i:] else None

否则:

def pluck(seq, index, default=None):
    try:
        return seq[index]
    except IndexError:
        return default

如果例外是常态:

def pluck(seq, index, default=None):
    return seq[index] if seq[index:] and seq[-index-1:] else default

两者都适用于负索引。

【讨论】:

    【解决方案3】:

    类似这样,它也适用于负索引。

    def list_get(lis, index, default = None):
       index = index if index >=0 else len(lis) + index
       return lis[index] if 0 <= index < len(lis) else default
    
    >>> lis = range(10)
    >>> list_get(lis, 8, 'foo')
    8
    >>> list_get(lis, 11, 'foo')
    'foo'
    >>> list_get(lis, -11, 'foo')
    'foo'
    >>> list_get(lis, -9, 'foo')
    1
    >>> list_get(lis, -5, 'foo')
    5
    

    【讨论】:

      【解决方案4】:

      看来你的 pluck 函数可以写成

      def pluck(list_items, index, default=None):
        if index>length(list_items)-1
           return default
         else 
            return list_items[index]
      

      【讨论】:

      • AttributeError: 'list_items' object has no attribute 'length'
      • 好的,也许是长度(list_items)?
      猜你喜欢
      • 2017-01-10
      • 1970-01-01
      • 2017-10-26
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多