从lis中获取特定数量的元素

2024-06-07 04:09:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下几点:

# 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小于ads的长度时,它正确地返回。因此get_all_ads工作。问题是当我尝试获取特定数量的广告时。当我尝试获取特定数量的广告时,例如ads[0, n],然后执行相同的操作以获取其中的所有广告时,我会得到以下错误:

TypeError
TypeError: list indices must be integers, not tuple

From:
File "/Users/tai/Desktop/FlashY/flashy/repository/mock.py", line 162, in get_all_adsn max=self._ads[0,n]

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

我不明白我的错误,我正在尝试按元素拆分一个列表(数组,我像[{},{},...]一样创建它)。为什么要说元组


Tags: ofinselfgetreturndef错误all
3条回答

你的代码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])

另外,我还冒昧地清理了你代码的最后两行。实际上,python切片非常智能,如果切片超出了序列的上限(列表、元组等等),它只会返回整个序列。这意味着您可以将整个函数重写为一个简单的片段

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

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]

代码中的变量_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]

相关问题 更多 >