【问题标题】:Python make a circular list to get out of range indexPython制作一个循环列表以超出范围索引
【发布时间】:2020-08-04 14:29:36
【问题描述】:

我正在寻找将列表制作成循环列表的方法,以便我可以调用索引超出范围的数字。

例如,我目前有这个类:

class myClass(list):
  definitely __init__(self, *x):
    super().__init__(x)

它的作用是:

>> myList = myClass(1,2,3,4,5,6,7,8,9,10)
>> print(myList)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

创建列表后,我想:

>> myList[2]
3
>> myList[12]
3
>> myList[302]
3
>> myList[-1]
10
>> myList[-21]
10
...

目前,索引 [12]、[302] 和 [-21] 是不可能的,因为它超出了单个列表的范围,所以如果索引超出范围,我想制作一个循环列表然后将使它们成为可能。

  • myList[12] = 3 因为循环列表将是 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ...]。
  • 该列表将仅由 5 或 10 个数字组成。

【问题讨论】:

  • 那么问题是什么?

标签: python list class


【解决方案1】:

如果你坚持为此创建一个完整的类,子类UserList,实现__getitem__ 并使用modulo operator (%) 与列表的长度:

class myClass(UserList):
    def __getitem__(self, item):
        return super().__getitem__(item % len(self))

myList = myClass([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(myList[12])

输出

3

根据您的使用情况,您可能需要实现其他几个list 方法。

CAVEAT:注意不要遍历myList。这将创建一个无限循环,因为__getitem__ 将始终能够提供列表中的元素。

【讨论】:

  • 请注意不要:list(myList)
  • 很有趣。
  • @IdRandom 是,将def __init__(self, *args): super().__init__(args) 添加到myClass
  • @DeepSpace 我希望调用iter(myList) 会导致一个永无止境的迭代器。您可以通过在类上定义__iter__() 来验证这一点。返回iter(self.data) 可能会避免该问题。
  • @MarkMeyer 对!它可能依赖于StopIteration,但自定义__getitem__ 永远不会让这种情况发生。即使for n in myList 也会导致无限循环。哎呀! :)
猜你喜欢
  • 2016-10-03
  • 1970-01-01
  • 2020-07-23
  • 2022-09-23
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
相关资源
最近更新 更多