Python追加或覆盖列表元素

时间:2013-07-09 01:09:04

标签: python ruby

你如何在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]可以轻松处理向数组附加元素,如果确实存在则更改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。是否有一种简单的方法可以替代地将值附加到数组或重置值?谢谢,

约书亚

2 个答案:

答案 0 :(得分: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]

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

答案 1 :(得分: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):
    ...