【问题标题】:make array index 1 instead of index 0 based使数组索引为 1 而不是基于索引 0
【发布时间】:2020-10-10 23:13:35
【问题描述】:

如何在 python 中使数组从下标 1 而不是下标 0 开始?

基本上是在python中解决这个problem

【问题讨论】:

  • 什么是数组?你到底想做什么?写python代码将matlab翻译成excel?
  • 每次访问时只需从索引中减去 1?或者你可以编写你自己的列表类来为你做这件事。
  • 我不确定这将如何解决 Excel 和 MATLAB 之间的互操作性问题。我想理论上可以继承list 并覆盖东西...... 5 分钟搞乱ipython 应该会有所帮助。然而,这对 MATLAB/Excel 有何帮助尚不清楚。你真的需要写一个文件转换脚本吗?在这种情况下,为什么不直接在您链接到的页面中使用 VBA 代码?如果您确实需要编写一个实现基于 1 的数组的 python 转换脚本,这并不是正确的方法。
  • 我正在编写代码以将 Nx1 矩阵放入使用 COM 启动的 matlab 工作区中。所以数组将保存 Nx1 矩阵数字。
  • @Wooble 数组是项目的集合,其中项目大小相等,因此它们的索引可以在大约 O(1) 时间内计算出来。与链表对比

标签: python


【解决方案1】:

如果你真的想这样做,你可以创建一个包装列表的类,并实现 __getitem____setitem__ 为一个基础的。例如:

def __getitem__(self, index):
  return self.list[index-1]

def __setitem__(self, index, value):
  self.list[index-1] = value

但是,要获得 Python 列表的全部灵活性,您必须实现对切片、删除等的支持。如果您只是想要一个简单的列表视图,一次一个项目,应该这样做给你。'

有关创建类似于序列或映射的自定义类的更多信息,请参阅Python Documentation for Data Model

【讨论】:

    【解决方案2】:

    你可以使用 enumerate() 方法

    a = ['a', 'c', 'v', 's']
    for i,v in enumerate(a, 1):
        print i, v
    
    1 a
    2 c
    3 v
    4 s
    

    【讨论】:

    • 其实enumerate是module builtins中的一个类,只是为了挑剔。
    【解决方案3】:

    +1 到Max。您可以尝试以下其他方法:

    只需在列表的索引 0 处添加 None。这应该为您提供功能。当您将列表传递给 MATLAB 时,您只需要记住剪掉前面的 None

    【讨论】:

      【解决方案4】:

      您可以使用fidx 模块的自定义索引:

      import fidx
      
      # create custom type `list1b` from `list`
      fidx.add(list, name='list1b')
      
      # add a map for int indexes (i -> i-1)
      fidx.list1b.set_index_map(int, lambda _,i: i-1, override=True)
      
      # create your list
      b = fidx.list1b([1,2,3])
      
      print(b[1], b[2], b[3]) # (1, 2, 3)
      

      【讨论】:

        猜你喜欢
        • 2020-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        相关资源
        最近更新 更多