【问题标题】:How do you create a list like PHP's in Python?如何在 Python 中创建类似 PHP 的列表?
【发布时间】:2010-10-01 03:05:54
【问题描述】:

这是一个非常简单的问题(我是 Python 新手)。

我基本上想要一个像 PHP 数组这样的数据结构——也就是说,我想初始化它,然后向其中添加值。

据我所知,这在 Python 中是不可能的,所以我已经得到了我可能想用作索引的最大值,但我不知道如何创建一个指定的空列表长度。

另外,列表是否是正确的数据结构,用于建模感觉它应该只是一个数组?我尝试使用数组,但它似乎对存储字符串不满意。

编辑:对不起,我没有很清楚地解释我在寻找什么。当我将项目添加到列表中时,我不想将它们按顺序放入,而是希望将它们插入到列表中的指定槽中。

也就是说,我希望能够做到这一点:

list = []

for row in rows:
  c = list_of_categories.index(row["id"])
  print c
  list[c] = row["name"]

【问题讨论】:

  • 是的,这听起来像是一个稀疏数组而不是一个列表(列表没有漏洞,备用数组有)。因此,Ned 使用字典的建议似乎是合理的,因为如果我没记错的话,这就是 php 数组的实现方式。

标签: python list


【解决方案1】:

http://diveintopython3.ep.io/native-datatypes.html#lists

您不需要创建具有指定长度的空列表。您只需添加它们并在需要时查询它们的当前长度。

如果不准备捕获异常,您不能做的是使用不存在的索引。这可能是您在 PHP 中所习惯的。

【讨论】:

  • 没错——不存在的索引是我真正的问题。
【解决方案2】:

我不确定我是否理解您的意思或想要做什么,但您似乎想要一个列表 类似于字典,其中索引是键。即使我认为,使用字典会更好 选择,这是我的答案:遇到问题 - 制作一个对象:

class MyList(UserList.UserList):

NO_ITEM = 'noitem'

def insertAt(self, item, index):

    length = len(self)
    if index < length:
        self[index] = item
    elif index == length:
        self.append(item)
    else:
        for i in range(0, index-length):
            self.append(self.NO_ITEM)
        self.append(item)

python 语法中可能有一些错误(未检查),但原则上它应该可以工作。 当然 else 情况也适用于 elif,但我想,这可能会更难一些 以这种方式阅读。

【讨论】:

    【解决方案3】:

    根据您将如何使用该列表,您可能确实需要一本字典。这将起作用:

    d = {}
    
    for row in rows:
      c = list_of_categories.index(row["id"])
      print c
      d[c] = row["name"]
    

    ...或更简洁:

    d = dict((list_of_categories.index(row['id']), row['name']) for row in rows)
    print d
    

    PHP 数组更像 Python 字典,而不是 Python 列表。例如,它们可以有字符串作为键。

    令人困惑的是,Python 有一个数组模块,它被描述为“有效的数值数组”,这绝对不是你想要的。

    【讨论】:

    • 如果您想按行名索引类别列表,请执行以下操作:d[row["name"]] = c
    • 啊...这听起来像我需要的。我会试一试。谢谢!
    • 完美——完成了这项工作。谢谢!
    【解决方案4】:

    使用字典,因为您真正需要的是可以通过任意键访问的结构

    list = {}
    
    for row in rows:
      c = list_of_categories.index(row["id"])
      print c
      list[c] = row["name"]
    

    然后你可以遍历已知的内容:

    for x in list.values():
      print x
    

    或者检查“列表”中是否存在某些东西:

    if 3 in list: 
      print "it's there"
    

    【讨论】:

      【解决方案5】:

      我同意 ned 的观点,即您可能需要一本字典来说明您正在尝试做的事情。但是,您可以通过以下方式获取这些类别列表的列表:

      lst = [list_of_categories.index(row["id"]) for row in rows]
      

      【讨论】:

        【解决方案6】:

        使用列表构造函数,并附加您的项目,如下所示:

        l = list ()
        l.append ("foo")
        l.append (3)
        print (l)
        

        给我['foo', 3],这应该是你想要的。请参阅documentation on listsequence type documentation

        编辑更新

        对于插入,使用insert,像这样:

        l = list ()
        l.append ("foo")
        l.append (3)
        l.insert (1, "new")
        print (l)
        

        打印['foo', 'new', 3]

        【讨论】:

        • 抱歉:我并没有很好地解释我需要什么。我不想附加项目,而是将它们插入到数组中的指定插槽中。我为我的问题添加了更多细节。
        【解决方案7】:

        如果您想插入指定的索引,您可能需要一个字典而不是数组。

        dict = {'a': 1, 'b': 2, 'c': 3}
        dict['a']
        

        1

        【讨论】:

          【解决方案8】:

          您可以使用此语法创建包含n 元素的列表:

          lst = [0] * n
          

          但要小心!该列表将包含此对象的n 副本。如果这个对象是可变的并且你改变了一个元素,那么所有的副本都会被改变!在这种情况下,您应该使用:

          lst = [some_object() for i in xrange(n)]
          

          然后你可以访问这些元素:

          for i in xrange(n):
              lst[i] += 1
          

          Python 列表类似于其他语言中的向量。它是一个可调整大小的数组,而不是链表。

          【讨论】:

            【解决方案9】:

            如果您想要的项目数量是预先知道的,并且您想使用整数、从 0 开始的连续索引来访问它们,您可以试试这个:

            n = 3
            array = n * [None]
            print array
            array[2] = 11
            array[1] = 47
            array[0] = 42
            print array
            

            打印出来:

            [None, None, None]
            [42, 47, 11]
            

            【讨论】:

              猜你喜欢
              • 2010-10-02
              • 2020-09-05
              • 2011-04-26
              • 2017-06-17
              • 2021-06-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-05-24
              相关资源
              最近更新 更多