【问题标题】:insert element into list, move pre-existing elements将元素插入列表,移动预先存在的元素
【发布时间】:2016-06-07 14:32:16
【问题描述】:

我正在尝试创建一个已定义的函数(没有列表/字符串方法): 到目前为止,我有在给定位置更新的代码,但我正在努力创建可以在列表位置插入变量并移动现有元素的代码。我希望输出是 ['a', 'b', 'c', 'd'] 而不是 ['a', 'b', 'c', 'e']。

请注意:这是为了学习,我确实想学习我希望被指出正确的方向,而不仅仅是提供答案。

def insert(list1, var, i):
    counter = 0
    for i in my_list:
        if counter == i:
            my_list[i] = var
        counter += 1
    return list1

list = ['a', 'b', 'd', 'e']
func = insert(list, 'c', 2)

我一夜之间一直在编写代码(很抱歉我在飞机上回复这么晚)

我想出了这段代码,我认为它可以工作,尽管它有点粗糙。任何人都可以就他们是否认为这是一个问题提供一些意见吗?

def insert(list1, var, i):
    new_list = []
    counter = -1
    for index in (list1[:-1]):
        counter += 1
        new_list.append(index)
        if counter == (i-1):
            new_list.append(var)

    return new_list

list2= ['a', 'b', 'c', 'd', 'e', 'f', 'h']
func = insert(list2, 'g', 6)
print(func)

【问题讨论】:

  • list.append都不能用吗?你会度过一段有趣的时光,因为我认为 list-comp 还没有被教过? (我想只有list.insert 超出范围)?
  • 您需要复制该列表——但由于您只是想要一个指向教程材料的指针,我可以建议effbot.org/zone/python-list.htm
  • 您确定不想将列表设为['a', 'b', 'c', 'd', 'e'] 吗?或者你需要恒定的长度?
  • 它需要一致的长度。列表长度不能增加。 append 可以使用
  • 该函数的目的是在给定位置插入,并将所有对象“向右移动1”但不增加列表大小。我对此的理解是,他们希望列表的末尾“掉线”。它声明将所有元素向下移动,但不增加列表的大小。

标签: python list function python-3.x


【解决方案1】:

使用切片,完全不用任何list 方法就可以很容易地做到这一点。如果你使用 Python 3.5+ 和 additional unpacking generalizations,它甚至看起来很漂亮:

def insert(list1, var, i):
    # Reassign all elements at and beyond the insertion point to be the new
    # value, and all but the last value previously there (so size is unchanged)
    list1[i:] = var, *list1[i:-1]

或者如果改变调用者的参数是不好的,并且你想返回一个新值:

def insert(list1, var, i):
    # Unpacking the components sliced as before to a brand new list
    return [*list1[:i], var, *list1[i:-1]]

没有解包概括,它不是很漂亮,但仍然可行,要么参数发生变化:

def insert(list1, var, i):
    # Uglier without unpacking generalizations
    list1[i], list1[i+1:] = var, list1[i:-1]

或新的list 构造:

def insert(list1, var, i):
    # An extra temporary without unpacking generalizations, but not ugly
    return list1[:i] + [var] + list1[i:-1]

如果您可以切片或索引,这将无济于事,但我想指出切片分配的强大功能和新的拆包泛化。

如果您想要一个仅使用 range 和/或 .append 而没有切片的解决方案:

def insert(list1, var, i):
    for idx in range(len(list1)-1, i, -1):
        list1[idx] = list1[idx-1]
    list1[i] = var

或非变异:

def insert(list1, var, i):
    newlist = []
    for idx in range(i):
        newlist.append(list1[idx])
    newlist.append(var)
    for idx in range(i, len(list1)-1):
        newlist.append(list1[idx])
    return newlist 

【讨论】:

    【解决方案2】:
    def insert(list1, var, i):
        new_list = list1[:i]
        new_list.append(var)
        new_list.extend(list1[i:])
        return new_list
    
    list = ['a', 'b', 'd', 'e']
    func = insert(list, 'c', 2)
    

    将list1 的部分直到i。这称为切片 将 var 附加到 new_list 上 使用 extend 来添加列表的其余部分

    ['a', 'b', 'c', 'd', 'e']
    

    【讨论】:

    • 我们无法使用 .extend,因为它是一个列表方法,我们唯一可用的列表方法是 .append,唯一可以使用的内置函数是 range() .这就是我到目前为止一直被困住的原因。
    【解决方案3】:

    在我的方法中,该方法返回半拆分列表以及您需要在它们之间添加的元素。

    In [15]: list = ['a', 'b', 'd', 'e']
    
    In [16]: def insert(lst, var, i):
       ....:     return lst[:i] + [var] + lst[i:]
       ....: 
    
    In [17]: insert(list, 'c', 2)
    Out[17]: ['a', 'b', 'c', 'd', 'e']
    

    编辑:这与@joel goldstick 发布的内容基本相同

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-17
      • 2012-11-26
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多