将元素添加到列表方法?append()
extend()
网友回答:
append
将元素添加到列表中。 将第一个列表与另一个列表/可迭代对象连接起来。extend
>>> xs = ['A', 'B']
>>> xs
['A', 'B']
>>> xs.append("D")
>>> xs
['A', 'B', 'D']
>>> xs.append(["E", "F"])
>>> xs
['A', 'B', 'D', ['E', 'F']]
>>> xs.insert(2, "C")
>>> xs
['A', 'B', 'C', 'D', ['E', 'F']]
>>> xs.extend(["G", "H"])
>>> xs
['A', 'B', 'C', 'D', ['E', 'F'], 'G', 'H']
网友回答:
append
在列表末尾追加指定的对象:
>>> x = [1, 2, 3]
>>> x.append([4, 5])
>>> print(x)
[1, 2, 3, [4, 5]]
extend
通过追加指定可迭代对象中的元素来扩展列表:
>>> x = [1, 2, 3]
>>> x.extend([4, 5])
>>> print(x)
[1, 2, 3, 4, 5]
网友回答:
列表方法追加和扩展有什么区别?
append
将其参数作为单个元素添加到列表的末尾。列表本身的长度将增加 1。extend
迭代其参数,将每个元素添加到列表中,从而扩展列表。列表的长度将增加可迭代参数中的元素数量。append
该方法将对象追加到列表的末尾。list.append
my_list.append(object)
无论对象是什么,无论是数字、字符串、另一个列表还是其他内容,它都会作为列表中的单个条目添加到 的末尾。my_list
>>> my_list
['foo', 'bar']
>>> my_list.append('baz')
>>> my_list
['foo', 'bar', 'baz']
所以请记住,列表是一个对象。如果将另一个列表追加到列表中,则第一个列表将是列表末尾的单个对象(这可能不是您想要的):
>>> another_list = [1, 2, 3]
>>> my_list.append(another_list)
>>> my_list
['foo', 'bar', 'baz', [1, 2, 3]]
#^^^^^^^^^--- single item at the end of the list.
extend
该方法通过从可迭代对象追加元素来扩展列表:list.extend
my_list.extend(iterable)
因此,通过扩展,可迭代对象的每个元素都会附加到列表中。例如:
>>> my_list
['foo', 'bar']
>>> another_list = [1, 2, 3]
>>> my_list.extend(another_list)
>>> my_list
['foo', 'bar', 1, 2, 3]
请记住,字符串是可迭代对象,因此如果使用字符串扩展列表,则在迭代字符串时将附加每个字符(这可能不是您想要的):
>>> my_list.extend('baz')
>>> my_list
['foo', 'bar', 1, 2, 3, 'b', 'a', 'z']
__add__
+
__iadd__
(+=
)为 定义 和运算符。它们在语义上类似于扩展。+
+=
list
my_list + another_list
在内存中创建第三个列表,以便您可以返回它的结果,但它要求第二个可迭代对象是列表。
my_list += another_list
就地修改列表(它是就地运算符,列表是可变对象,如我们所见),因此它不会创建新列表。它也像扩展一样工作,因为第二个可迭代对象可以是任何类型的可迭代对象。
不要混淆 – 不等同于- 它为您提供了一个分配给my_list的全新列表。my_list = my_list + another_list
+=
追加具有(摊销)恒定时间复杂度 O(1)。
扩展具有时间复杂度 O(k)。
遍历多个调用 会增加复杂性,使其等效于 extend,并且由于 extend 的迭代是用 C 实现的,如果您打算将可迭代对象的连续项附加到列表中,它总是会更快。append
关于“摊销” – 来自列表对象实现源:
/* This over-allocates proportional to the list size, making room
* for additional growth. The over-allocation is mild, but is
* enough to give linear-time amortized behavior over a long
* sequence of appends() in the presence of a poorly-performing
* system realloc().
这意味着我们可以预先获得比所需更大的内存重新分配的好处,但我们可能会在下一次边际重新分配时用更大的内存重新分配来支付它。所有追加的总时间在 O(n) 处呈线性,每个追加分配的时间变为 O(1)。
您可能想知道什么性能更高,因为追加可用于实现与扩展相同的结果。以下函数执行相同的操作:
def append(alist, iterable):
for item in iterable:
alist.append(item)
def extend(alist, iterable):
alist.extend(iterable)
因此,让我们计时:
import timeit
>>> min(timeit.repeat(lambda: append([], "abcdefghijklmnopqrstuvwxyz")))
2.867846965789795
>>> min(timeit.repeat(lambda: extend([], "abcdefghijklmnopqrstuvwxyz")))
0.8060121536254883
一位评论者说:
完美的答案,我只是错过了比较只添加一个元素的时机
做语义正确的事情。如果要追加可迭代对象中的所有元素,请使用 。如果只添加一个元素,请使用 .extend
append
好的,让我们创建一个实验,看看它是如何及时解决的:
def append_one(a_list, element):
a_list.append(element)
def extend_one(a_list, element):
"""creating a new list is semantically the most direct
way to create an iterable to give to extend"""
a_list.extend([element])
import timeit
我们看到,为了使用扩展而特意创建一个可迭代对象是(轻微的)浪费时间:
>>> min(timeit.repeat(lambda: append_one([], 0)))
0.2082819009956438
>>> min(timeit.repeat(lambda: extend_one([], 0)))
0.2397019260097295
我们从中了解到,当我们只有一个元素要附加时,使用没有任何好处。extend
此外,这些时间并不那么重要。我只是向他们展示一个观点,即在Python中,做语义正确的事情就是以正确的方式™做事。
可以想象,您可能会在两个可比较的操作上测试时序,并得到模棱两可或相反的结果。只要专注于做语义正确的事情。
我们看到这在语义上更清晰,并且当您打算将可迭代对象中的每个元素附加到列表时,它的运行速度比 快得多。extend
append
如果只有一个元素(不在可迭代对象中)要添加到列表中,请使用 。append
模板简介:该模板名称为【将元素添加到列表方法?append()extend()】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Python】栏目查找您需要的精美模板。