Python列表索引或追加?

时间:2015-05-21 23:18:34

标签: python list indexing append

在处理时间,内存使用方面以及通常什么是最佳编程选项方面,为List添加值的最佳方法是什么?

list = []

for i in anotherArray:
    list.append(i)

list = range(len(anotherArray))

for i in list:
    list[i] = anotherArray[i]

考虑到anotherArray是一个元组数组。 (这只是一个简单的例子)

3 个答案:

答案 0 :(得分:1)

最好的方法是列表理解:

my_list=[i for i in anotherArray]

但根据您的问题,您可以使用生成器表达式(当您只想循环您的项目并且不需要使用某些列表方法(如indexing)时,它比列表理解更有效len或......)

my_list=(i for i in anotherArray)

答案 1 :(得分:1)

这实际上取决于您的使用案例。这里没有通用的答案,因为它取决于你想要做什么。

在您的示例中,看起来您只是想创建数组的副本,在这种情况下,执行此操作的最佳方法是使用副本:

from copy import copy    
list = copy(anotherArray)

如果您尝试将数组转换为另一个数组,则应使用list comprehension。

list =  [i[0] for i in anotherArray]  # get the first item from tuples in anotherArray

如果您尝试同时使用索引和对象,则应使用enumerate:

for i, j in enumerate(list)

这比你的第二个例子要好得多。

您还可以使用生成器,lambas,地图,过滤器等。所有这些可能性存在的原因是因为它们都是“更好”的#34;出于不同的原因。 python的写作在#34;一个正确的方式上非常重要,所以相信我,如果有一种通用方法总是更好,那就是python中唯一存在的方式。

编辑:为元组交换提供一些性能结果,结果如下:

comprehension: 2.682028295999771
enumerate: 5.359116118001111
for in append: 4.177091988000029
for in indexes: 4.612594166001145

正如你所知,理解通常是最好的选择。使用枚举是昂贵的。 以下是上述测试的代码:

from timeit import timeit

some_array = [(i, 'a', True) for i in range(0,100000)]

def use_comprehension():
    return [(b, a, i) for i, a, b in some_array]

def use_enumerate():
    lst = []
    for j, k in enumerate(some_array):
        i, a, b = k
        lst.append((b, a, i))
    return lst

def use_for_in_with_append():
    lst = []
    for i in some_array:
        i, a, b = i
        lst.append((b, a, i))
    return lst

def use_for_in_with_indexes():
    lst = [None] * len(some_array)
    for j in range(len(some_array)):
        i, a, b = some_array[j]
        lst[j] = (b, a, i)
    return lst

print('comprehension:', timeit(use_comprehension, number=200))
print('enumerate:', timeit(use_enumerate, number=200))
print('for in append:', timeit(use_for_in_with_append, number=200))
print('for in indexes:', timeit(use_for_in_with_indexes, number=200))

EDIT2:

有人向我指出OP只是想知道"索引"之间的区别。和"追加"。实际上,它们也用于两种不同的用例。索引用于替换对象,而附加用于添加。但是,在列表开始为空的情况下,追加将始终更好,因为索引具有最初创建列表的开销。您可以从上面的结果中看到,索引稍微慢一点,主要是因为您必须创建第一个列表。

答案 2 :(得分:0)

我实际上说最好的是index loopsvalue loops与枚举的组合:

for i, j in enumerate(list): # i is the index, j is the value, can't go wrong