在处理时间,内存使用方面以及通常什么是最佳编程选项方面,为List添加值的最佳方法是什么?
list = []
for i in anotherArray:
list.append(i)
或
list = range(len(anotherArray))
for i in list:
list[i] = anotherArray[i]
考虑到anotherArray是一个元组数组。 (这只是一个简单的例子)
答案 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 loops
和value loops
与枚举的组合:
for i, j in enumerate(list): # i is the index, j is the value, can't go wrong