1

你如何在python中附加或覆盖列表元素?

我目前正在尝试将我在 ruby​​ 中工作的函数转换为 python,我的 ruby​​ 代码如下所示:

def self.push_array_hash(key,selector,level,array)
  (0..array.length).each do |i|
    x = array[i]
    selector[level] = i+1
    if(x.is_a?(Array))
      self.push_array_hash(key,selector,level+1,x)
    end
    self.push_datum("#{key}(#{selector.join(',')})", x)
  end
end

我可以将此函数称为:self.push_array_hash(key,Array.new,0,val)无需知道嵌套数组的维度。如果该元素尚不存在,则该代码selector[level] = i+1可以轻松地处理将元素附加到数组中,并在它确实存在selector[level]时更改 at 的值。level

那是红宝石(只给了每个人都可以理解我的目标),到python。这是我翻译的代码:

def push_list_dict(self, key, selector, level, array):
  for i, x in enumerate(array):
    selector[level] = i+1
    if isinstance(x, (list, set)):
      if isinstance(value, set):
        value = sorted(value)
      self.push_list_dict(key,selector,level+1,x)
    self.push_datum(key+"("+",".join(map(str, selector))+")",x)

我这样调用函数:self.push_array_dict(key,[],0,value),但是它会中断selector[level] = i+1并给我错误:IndexError: list assignment index out of range。是否有一种简单的方法可以将值附加到数组或重置值?谢谢,

约书亚

4

2 回答 2

3

你可以使用:

selector[level:level+1] = [i+1]

如果selector[level]已经存在,则替换该值。如果它尚不存在,则附加该值。

例如,

In [102]: selector = []

In [103]: selector[0:1] = [100]

In [104]: selector
Out[104]: [100]

In [105]: selector[0:1] = [200]

In [106]: selector
Out[106]: [200]

注意如果索引超出 的长度会发生什么selector

In [107]: selector[7:8] = [300]

In [108]: selector
Out[108]: [200, 300]

它不会在该索引位置插入,它只是追加。

于 2013-07-09T01:21:06.427 回答
1

Python 并没有像 ruby​​ 那样神奇地扩展数组。一种方法是检查长度并使用[None] * x或填充到正确的长度[0] * x

selector += [None] * (level-len(selector))
selector[level] = i+1

在旁边:

range不包括“停止”值,所以你可能不想要-1那里。通常的写法

for i in range(0,len(array)-1):
    x = array[i]
    ...

for i, x in enumerate(array):
    ...
于 2013-07-09T01:30:58.430 回答