【问题标题】:Append integer to beginning of list in Python [duplicate]在Python中将整数附加到列表的开头[重复]
【发布时间】:2013-07-28 11:29:32
【问题描述】:

我有一个整数和一个列表。我想创建一个以变量开头并以列表结尾的新列表。 写a + list 我得到错误。编译器将a 处理为整数,因此我不能使用附加或扩展。 你会怎么做呢?

【问题讨论】:

  • 就计算时间而言,new_list = [x] + your_list 的效率是否低于your_list.insert(x)

标签: python list variables append


【解决方案1】:

替代方案:

>>> from collections import deque

>>> my_list = deque()
>>> my_list.append(1)       # append right
>>> my_list.append(2)       # append right
>>> my_list.append(3)       # append right
>>> my_list.appendleft(100) # append left
>>> my_list

deque([100, 1, 2, 3])

>>> my_list[0]

100

[注意]:

collections.deque 在循环中比 Python 纯 list 快​​ Relevant-Post

【讨论】:

    【解决方案2】:

    您可以使用解包列表:

    a = 5

    li = [1,2,3]

    li = [a, *li]

    => [5, 1, 2, 3]

    【讨论】:

      【解决方案3】:
      list_1.insert(0,ur_data)
      

      确保 ur_data 是字符串类型 所以如果你有data= int(5) 把它转换成ur_data = str(data)

      【讨论】:

        【解决方案4】:

        基于使用timeit 模块的一些(最小)基准测试,似乎以下性能与公认的答案相似,甚至更好

        new_lst = [a, *lst]
        

        [a] + list 一样,这将创建一个新列表并且不会改变lst

        如果您打算改变列表,请使用lst.insert(0, a)

        【讨论】:

          【解决方案5】:

          这些都不适合我。我将第一个元素转换为系列(单个元素系列)的一部分,并将第二个元素也转换为系列,并使用了追加功能。

          l = ((pd.Series(<first element>)).append(pd.Series(<list of other elements>))).tolist()
          

          【讨论】:

            【解决方案6】:

            只需将列表添加在一起即可创建新列表。

            list1 = ['value1','value2','value3']
            list2 = ['value0']
            newlist=list2+list1
            print(newlist)
            

            【讨论】:

            • 评价最高的答案已经涵盖了这一点。请解释这如何为问题添加新信息。
            • 哦,它什么也没增加
            【解决方案7】:
            >>>var=7
            >>>array = [1,2,3,4,5,6]
            >>>array.insert(0,var)
            >>>array
            [7, 1, 2, 3, 4, 5, 6]
            

            它是如何工作的:

            array.insert(index, value)

            在给定位置插入一个项目。第一个参数是要插入的元素的索引,所以array.insert(0, x)插入到列表的最前面,array.insert(len(array), x)等价于array.append(x)。负值被视为相对于数组的末尾.

            【讨论】:

            • 最有效的方法。比 [x]+[y] 快。在此处查看解决方案:stackoverflow.com/questions/8537916/…
            • 该问题明确指出应该创建一个 new 列表。所以这可能很快——但错误。 ;-)
            • @BlackJack 问题是关于如何将整数附加到列表的开头。无论他描述什么,这都不是正确的做法。那为什么要引导他走错路呢?当他有更好的事情可以满足他的要求时。
            • 他所描述的可能正是他所需要的。你怎么知道不需要使用副本而不是更改原始列表?例如,它可能是一个函数的参数,调用者不希望修改列表,这样做会在程序中引入错误。
            • 在这种情况下,问题标题应该不同。无论如何,争论没有意义,因为我们俩都很清楚这一点。无论如何,谢谢你指出。 :)
            【解决方案8】:

            请注意,如果您经常尝试执行该操作,尤其是在循环中,列表是错误的数据结构

            列表没有针对前面的修改进行优化,somelist.insert(0, something)O(n) operation

            somelist.pop(0)del somelist[0] 也是 O(n) 操作。

            要使用的正确数据结构是来自collections 模块的deque。双端队列公开了一个类似于列表的接口,但针对来自两个端点的修改进行了优化。他们有一个appendleft 用于在前面插入的方法。

            演示:

            In [1]: lst = [0]*1000
            In [2]: timeit -n1000 lst.insert(0, 1)
            1000 loops, best of 3: 794 ns per loop
            In [3]: from collections import deque
            In [4]: deq = deque([0]*1000)
            In [5]: timeit -n1000 deq.appendleft(1)
            1000 loops, best of 3: 73 ns per loop
            

            【讨论】:

            • 有时候切换结构不是一件容易的事,如果你需要在前面追加一堆东西,你可以调用 .reverse 然后把所有的东西都添加到最后,然后再次调用反向。你会得到两个 O(n) 操作,然后使用 O(1) 添加列表。
            • 就计算时间而言,new_list = [x] + your_list 的效率是否低于your_list.insert(x)
            【解决方案9】:

            另一种方法,

            list[0:0] = [a]
            

            【讨论】:

            • 你不需要第一个 0。冒号已经说那是在开始之前 -- my_list[:0]=[a] 做到了。
            • 优雅的解决方案!
            • 这很有趣,但我会避免这样做,因为我认为它可能会引起混乱。
            • 这并不优雅,它不必要地令人困惑且难以阅读。
            【解决方案10】:
            >>> a = 5
            >>> li = [1, 2, 3]
            >>> [a] + li  # Don't use 'list' as variable name.
            [5, 1, 2, 3]
            

            【讨论】:

            • 我刚刚做了一些基准测试。 li.insert(0, a)li = [a] + li 快大约 5 倍。如果您多次这样做,请记住这一点。
            • @MarcelPfeiffer 应该注意的是,li.insert(0, a) 正在变异 lili = [a] + li 正在创建一个将所有值的新实例。如果其他事物有对列表实例的引用,这是一个重要的区别。
            • 如果python能添加一个list.push_front(item)函数就好了。这将是显而易见的并且不易出错。
            • @KeminZhou 我更喜欢“prepend”这个名字,因为它自然地来自“append”,因为“push_front”自然地来自“push_back”。
            • @羊驼之神,我同意你的看法。越短越好。
            猜你喜欢
            • 2016-10-01
            • 1970-01-01
            • 2015-02-04
            • 2013-12-30
            • 2020-08-06
            • 2013-06-18
            • 2017-04-29
            • 1970-01-01
            • 2020-07-04
            相关资源
            最近更新 更多