从列表中获取特定数量的元素

时间:2014-07-17 23:32:49

标签: python arrays flask

我有以下内容:

# returns a list of all items in ads collection

class Vault:

  def __init__(self):
    myDate = self.getTodayDate()
    myTime = self.getTodayTime()
    # used to mock collection (table) of ads
    self._ads = [ {
        'id': '00000000-0000-0000-0000-000000000000',
        'date': myDate,
      'time': myTime,
        'source': 'chron.com',
        'advertiser': 'itunes.apple.com',
        'width': 300,
        'height': 250
    } ]
  def get_all_ads(self):
    return ( ad for ad in self._ads )
  def get_all_adsn(self,n):
    n = int(n)
    if self._ads.__len__()<n:
      return self.get_all_ads()
    max = self._ads[0, n]
    return ( ad for ad in max )

n小于广告的长度时,它会正确返回。因此get_all_ads有效。问题是当我尝试获取特定数量的广告时。当我尝试获取特定数字,例如ads[0, n]然后执行同样的操作以获取所有广告时,我收到以下错误:

  

类型错误
  TypeError:list indices必须是整数,而不是元组

     

自:
  文件&#34; /Users/tai/Desktop/FlashY/flashy/repository/mock.py",第162行,在get_all_adsn中max = self._ads [0,n]

._ads是一个列表,为什么我无法访问它?我将n转换为int(我使用flask / routes来调用它)。因此,如果我运行get_all_adsn(2),我会得到正确的结果,但是当我运行get_all_adsn(1)时,我会收到错误。

我不理解我的错误,我试图按元素拆分列表(数组,我创建它像[{},{},...])。为什么谈论元组?

3 个答案:

答案 0 :(得分:2)

你的代码max = self._ads[0,n]不是有效的python。在python中切片列表的语法是self._ads[0:n],请尝试使用

def get_all_adsn(self,n):
    n=int(n)
    if self._ads.__len__()<n:
        return self.get_all_ads()
    return tuple(self._ads[0:n])

P.S。我冒昧地清理了代码的最后两行。实际上,python切片足够智能,如果切片超出序列的上限(列表,元组,无论如何),它只会返回整个序列。这意味着您可以将整个函数重写为一个简单的切片

def get_all_adsn(self,n):
    return self._ads[0:int(n)]

答案 1 :(得分:1)

代码中的变量_ads是一个列表。并访问列表:

_ads[0, 2]

在Python中没有任何意义,这就是你看错的原因。您可以通过在Python shell中尝试来确认这一点:

>>> a_list = [1, 2, 3]
>>> a_list[0, 2]

Traceback (most recent call last):
  File "<pyshell#108>", line 1, in <module>
    a_list[0, 2]
TypeError: list indices must be integers, not tuple

调用get_all_adsn(2)时代码的工作原因是因为在这种情况下n为2并且在代码中传递了此条件:

if self._ads.__len__() < n:

因此不执行该行:

max=self._ads[0,n]

您可能希望将其更改为:

max=self._ads[0:n]

答案 2 :(得分:1)

l[1, 2]l[(1, 2)]相同,这不是您想要的。您可能打算使用切片,它具有不同的语法(l[1:2]):

class Vault:
    def __init__(self):
        self.ads = [{
            'id': '00000000-0000-0000-0000-000000000000',
            'date': self.getTodayDate(),
            'time': self.getTodayTime(),
            'source': 'chron.com',
            'advertiser': 'itunes.apple.com',
            'width': 300,
            'height': 250
        }]

    def get_all_ads(self):
        return self.ads

    def get_all_adsn(self, n):
        return self.ads[:n]