列表方法
1 2 3 | x = [1, 2, 3] x.append([4, 5]) print (x) |
给你:
1 2 3 | x = [1, 2, 3] x.extend([4, 5]) print (x) |
给你:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | >>> li = ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li ['a', 'b', 'mpilgrim', 'z', 'example'] >>> li.append("new") >>> li ['a', 'b', 'mpilgrim', 'z', 'example', 'new'] >>> li.append(["new", 2]) >>> li ['a', 'b', 'mpilgrim', 'z', 'example', ['new', 2]] >>> li.insert(2,"new") >>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new'] >>> li.extend(["two","elements"]) >>> li ['a', 'b', 'new', 'mpilgrim', 'z', 'example', 'new', 'two', 'elements'] |
从研究Python开始。
What is the difference between the list methods append and extend?
append
1 | my_list.append(object) |
无论对象是什么,无论是一个数字、一个字符串、另一个列表,还是其他什么,它都作为列表上的一个条目添加到
1 2 3 4 5 | >>> my_list ['foo', 'bar'] >>> my_list.append('baz') >>> my_list ['foo', 'bar', 'baz'] |
所以请记住列表是一个对象。如果在列表中添加另一个列表,第一个列表将是列表末尾的单个对象(这可能不是您想要的):
1 2 3 4 5 | >>> 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
1 | my_list.extend(iterable) |
因此,使用extend,迭代器的每个元素都被添加到列表中。例如:
1 2 3 4 5 6 | >>> my_list ['foo', 'bar'] >>> another_list = [1, 2, 3] >>> my_list.extend(another_list) >>> my_list ['foo', 'bar', 1, 2, 3] |
请记住,字符串是可迭代的,所以如果您使用字符串扩展列表,您将在迭代字符串时附加每个字符(这可能不是您想要的):
1 2 3 | >>> my_list.extend('baz') >>> my_list ['foo', 'bar', 1, 2, 3, 'b', 'a', 'z'] |
操作符重载,
不要混淆-
时间复杂度。
Append具有恒定的时间复杂度O(1)。
扩展具有时间复杂度O(k)。
遍历对
性能
您可能想知道什么性能更好,因为append可以用于实现与extend相同的结果。下面的函数做同样的事情:
1 2 3 4 5 6 | def append(alist, iterable): for item in iterable: alist.append(item) def extend(alist, iterable): alist.extend(iterable) |
让我们来计时:
1 2 3 4 5 6 | import timeit >>> min(timeit.repeat(lambda: append([],"abcdefghijklmnopqrstuvwxyz"))) 2.867846965789795 >>> min(timeit.repeat(lambda: extend([],"abcdefghijklmnopqrstuvwxyz"))) 0.8060121536254883 |
处理时间上的注释
一位评论者说:
Perfect answer, I just miss the timing of comparing adding only one element
做语义上正确的事情。如果您想在一个迭代中添加所有元素,请使用
好了,让我们做个实验看看这在时间上是如何实现的:
1 2 3 4 5 6 7 8 9 | 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 |
我们发现,创建一个只使用extend的可迭代的方法是(小的)浪费时间:
1 2 3 4 | >>> min(timeit.repeat(lambda: append_one([], 0))) 0.2082819009956438 >>> min(timeit.repeat(lambda: extend_one([], 0))) 0.2397019260097295 |
我们从中了解到,当我们只有一个元素要追加时,使用
而且,这些时间并不是那么重要。我只是想让他们明白,在Python中,做语义正确的事情就是用正确的方法来做事情。
可以想象,您可以在两个可比较的操作上测试计时,并得到一个模糊的或相反的结果。只要专注于做语义上正确的事情。
结论我们看到
如果您只有一个元素(不在iterable中)要添加到列表中,请使用
注意,如果您传递一个列表来追加,它仍然会添加一个元素:
1 2 3 4 | >>> a = [1, 2, 3] >>> a.append([4, 5, 6]) >>> a [1, 2, 3, [4, 5, 6]] |
以下两个片段在语义上是等价的:
1 2 | for item in iterator: a_list.append(item) |
和
1 | a_list.extend(iterator) |
后者可能更快,因为循环是在C语言中实现的。
方法的作用是:将单个项添加到列表的末尾。
1 2 3 4 5 6 | x = [1, 2, 3] x.append([4, 5]) x.append('abc') print(x) # gives you [1, 2, 3, [4, 5], 'abc'] |
extend()方法接受一个参数列表,并将参数的每个项附加到原始列表中。列表被实现为类。"创建"列表实际上是实例化一个类。因此,列表具有对其进行操作的方法。)
1 2 3 4 5 6 | x = [1, 2, 3] x.extend([4, 5]) x.extend('abc') print(x) # gives you [1, 2, 3, 4, 5, 'a', 'b', 'c'] |
从研究Python开始。
您可以使用"+"来返回extend,而不是直接进行扩展。
1 2 3 4 5 6 7 8 9 10 11 | l1=range(10) l1+[11] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11] l2=range(10,1,-1) l1+l2 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2] |
类似的
Append vs Extend
使用append,您可以添加一个元素来扩展列表:
1 2 3 4 | >>> a = [1,2] >>> a.append(3) >>> a [1,2,3] |
如果你想扩展多个元素,你应该使用扩展,因为你只能添加一个元素或一个元素列表:
1 2 3 | >>> a.append([4,5]) >>> a >>> [1,2,3,[4,5]] |
这样就得到了一个嵌套列表
相反,使用extend,您可以像这样扩展单个元素
1 2 3 4 | >>> a = [1,2] >>> a.extend([3]) >>> a [1,2,3] |
或者,与append不同的是,一次扩展多个元素,而不将列表嵌套到原来的列表中(这就是名称extend的原因)
1 2 3 | >>> a.extend([4,5,6]) >>> a [1,2,3,4,5,6] |
用两种方法添加一个元素
追加一个元素1 2 3 4 | >>> x = [1,2] >>> x.append(3) >>> x [1,2,3] |
扩展一个元素
1 2 3 4 | >>> x = [1,2] >>> x.extend([3]) >>> x [1,2,3,4] |
Adding more elements... with different results
如果您对多个元素使用append,则必须将元素列表作为参数传递,您将获得一个嵌套列表!
1 2 3 4 | >>> x = [1,2] >>> x.append([3,4]) >>> x [1,2,[3,4]] |
使用extend,您将传递一个列表作为参数,但是您将获得一个包含新元素的列表,而旧元素中没有嵌套新元素。
1 2 3 4 | >>> z = [1,2] >>> z.extend([3,4]) >>> z [1,2,3,4] |
因此,对于更多的元素,您将使用extend获得包含更多项的列表。您将使用append,不是向列表添加更多的元素,而是一个嵌套列表元素,您可以在代码的输出中清楚地看到。
1 2 3 4 5 6 | x = [20] # List passed to the append(object) method is treated as a single object. x.append([21, 22, 23]) # Hence the resultant list length will be 2 print(x) --> [20, [21, 22, 23]] |
1 2 3 4 5 6 7 | x = [20] # The parameter passed to extend(list) method is treated as a list. # Eventually it is two lists being concatenated. x.extend([21, 22, 23]) # Here the resultant list's length is 4 print(x) [20, 21, 22, 23] |
从
1 | list2d = [[1,2,3],[4,5,6], [7], [8,9]] |
你想要的
1 2 | >>> [1, 2, 3, 4, 5, 6, 7, 8, 9] |
您可以使用
1 2 3 4 5 | def from_iterable(iterables): # chain.from_iterable(['ABC', 'DEF']) --> A B C D E F for it in iterables: for element in it: yield element |
回到我们的例子,我们可以做到
1 2 3 | import itertools list2d = [[1,2,3],[4,5,6], [7], [8,9]] merged = list(itertools.chain.from_iterable(list2d)) |
然后拿到通缉名单。
下面是如何等价地使用
1 2 3 4 5 | merged = [] merged.extend(itertools.chain.from_iterable(list2d)) print(merged) >>> [1, 2, 3, 4, 5, 6, 7, 8, 9] |
这相当于使用
1 2 3 4 5 6 7 8 9 | >>> x = [1,2,3] >>> x [1, 2, 3] >>> x = x + [4,5,6] # Extend >>> x [1, 2, 3, 4, 5, 6] >>> x = x + [[7,8]] # Append >>> x [1, 2, 3, 4, 5, 6, [7, 8]] |
append():在Python中,它基本上用于添加一个元素。
Example 1:
1 2 3 4 | >> a = [1, 2, 3, 4] >> a.append(5) >> print(a) >> a = [1, 2, 3, 4, 5] |
Example 2:
1 2 3 4 | >> a = [1, 2, 3, 4] >> a.append([5, 6]) >> print(a) >> a = [1, 2, 3, 4, [5, 6]] |
extend():其中,extend()用于合并两个列表或在一个列表中插入多个元素。
Example 1:
1 2 3 4 5 | >> a = [1, 2, 3, 4] >> b = [5, 6, 7, 8] >> a.extend(b) >> print(a) >> a = [1, 2, 3, 4, 5, 6, 7, 8] |
Example 2:
1 2 3 4 | >> a = [1, 2, 3, 4] >> a.extend([5, 6]) >> print(a) >> a = [1, 2, 3, 4, 5, 6] |
有一个有趣的观点已经暗示过了,但是没有解释,那就是扩展比追加要快。对于任何在内部附加的循环,都应该考虑用list.extend(processed_elements)替换。
记住,获取新元素可能会导致将整个列表重新分配到内存中更好的位置。如果因为一次添加一个元素而多次执行此操作,则会影响整体性能。在这个意义上,列表。extend类似于"".join(stringlist)。
Append立即添加整个数据。整个数据将被添加到新创建的索引中。另一方面,
例如
1 2 | list1 = [123, 456, 678] list2 = [111, 222] |
使用
1 | result = [123, 456, 678, [111, 222]] |
而在
1 | result = [123, 456, 678, 111, 222] |
英语词典将
追加:在书面文件的末尾添加(某物)。
扩展:大。放大或扩大
有了这些知识,现在让我们来理解
1)
2)
例子
1 2 3 4 5 6 7 8 | lis = [1, 2, 3] # 'extend' is equivalent to this lis = lis + list(iterable) # 'append' simply appends its argument as the last element to the list # as long as the argument is a valid Python object lis.append(object) |
方法"append"将其参数作为单个元素添加到列表中,而"extend"获取列表并添加其内容。
例如,
extend
1 2 3 | letters = ['a', 'b'] letters.extend(['c', 'd']) print(letters) # ['a', 'b', 'c', 'd'] |
append
1 2 | letters.append(['e', 'f']) print(letters) # ['a', 'b', 'c', 'd', ['e', 'f']] |
我希望我能对这个问题做一个有益的补充。如果您的列表存储了一个特定类型的对象,例如
TypeError: 'Info' object is not iterable
但是如果使用
在另一本词典上附加一本词典:
1 2 3 4 5 6 7 8 9 10 | >>>def foo(): dic = {1:'a', 2:'b', 3:'c', 4:'a'} newdic = {5:'v', 1:'aa'} for i in dic.keys(): if not newdic.has_key(dic[i]): newdic[i] = dic[i] print"Appended one:", newdic >>>foo() Appended one: {1: 'a', 2: 'b', 3: 'c', 4: 'a', 5: 'v'} |
直观地区分它们
1 2 3 4 5 | l1 = ['a', 'b', 'c'] l2 = ['d', 'e', 'f'] l1.append(l2) l1 ['a', 'b', 'c', ['d', 'e', 'f']] |
这就像
1 2 3 4 | # Reset l1 = ['a', 'b', 'c'] l1.extend(l2) l1 ['a', 'b', 'c', 'd', 'e', 'f'] |
就像两个分开的人结婚,组成了一个完整的家庭。
此外,我还列出了清单上所有方法的详尽备忘单,供您参考。
1 2 3 4 5 6 | list_methods = {'Add': {'extend', 'append', 'insert'}, 'Remove': {'pop', 'remove', 'clear'} 'Sort': {'reverse', 'sort'}, 'Search': {'count', 'index'}, 'Copy': {'copy'}, } |
追加:在现有列表的末尾添加"列表"或"单个元素"
1 2 3 4 5 6 | a = [1,2] b = [3] a.append(b) print(a) # prints [1,2,[3]] a.append(4) print(a) # prints [1,2,[3],4] |
扩展:将"列表元素"(作为参数传递)添加到现有列表。
1 2 3 4 5 | a = [1,2] b = [3] a.extend(b) print(a) # prints [1,2,3] a.extend(4) # typeError as int cannot be used as argument with extend |
通过附加给定列表L中的所有项来扩展列表。
1 2 3 4 5 6 7 8 9 10 11 | >>> a [1, 2, 3] a.extend([4) #is eqivalent of a[len(a):] = [4] >>>a [1, 2, 3, 4] a =[1,2,3] >>> a [1, 2, 3] >>> a[len(a):] = [4] >>> a [1, 2, 3, 4] |
这帮助我理解了当你使用
1 2 3 4 5 6 7 8 9 10 11 12 | a = [[1,2,3],[4,5,6]] print(a) >>> [[1, 2, 3], [4, 5, 6]] a.append([6,7,8]) print(a) >>> [[1, 2, 3], [4, 5, 6], [6, 7, 8]] a.extend([0,1,2]) print(a) >>> [[1, 2, 3], [4, 5, 6], [6, 7, 8], 0, 1, 2] a=a+[8,9,10] print(a) >>> [[1, 2, 3], [4, 5, 6], [6, 7, 8], 0, 1, 2, 8, 9, 10] |
方法将添加作为单个元素传递给它的参数。
extend()将遍历传递的参数并通过传递每个遍历的元素来扩展列表,基本上它将添加多个元素,而不是将整个元素添加为一个元素。
1 2 3 4 5 6 7 8 9 10 | list1 = [1,2,3,4,5] list2 = [6,7,8] list1.append(list2) print(list1) #[1,2,3,4,5,[6,7,8]] list1.extend(list2) print(list1) #[1,2,3,4,5,6,7,8] |
Append:将其参数作为单个元素添加到列表的末尾。
如:-
1 2 3 | my_list = ['stack', 'over'] my_list.append('flow') print my_list |
输出:
1 | ['stack', 'over', 'flow'] |
注意:如果在列表中添加另一个列表,第一个列表将是列表末尾的单个对象。
如:-
1 2 3 4 | my_list = ['stack', 'over', 'flow'] another_list = [1,2,3,4] , my_list.append(another_list) print my_list |
输出:
1 | ['stack', 'over', 'over', [1,2,3,4]] |
如:-
1 2 3 4 | my_list = ['stack', 'over'] another_list = [6, 0, 4, 1] my_list.extend(another_list) print my_list |
输出:
1 | ['stack', 'over', 6, 0, 4, 1] |
注意:- string是一个可迭代的,所以如果您使用string扩展列表,您将在遍历该字符串时附加每个字符。
如:-
1 2 3 | my_list = ['stack', 'overflow', 6, 0, 4, 1] my_list.extend('hello') print my_list |
对于
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 def append_o(a_list, element):
a_list.append(element)
print('append:', end = ' ')
for item in a_list:
print(item, end = ',')
print()
def extend_o(a_list, element):
a_list.extend(element)
print('extend:', end = ' ')
for item in a_list:
print(item, end = ',')
print()
append_o(['ab'],'cd')
extend_o(['ab'],'cd')
append_o(['ab'],['cd', 'ef'])
extend_o(['ab'],['cd', 'ef'])
append_o(['ab'],['cd'])
extend_o(['ab'],['cd'])
生产:
1 2 3 4 5 6 | append: ab,cd, extend: ab,c,d, append: ab,['cd', 'ef'], extend: ab,cd,ef, append: ab,['cd'], extend: ab,cd, |
追加和扩展是python中的一种可扩展性机制。
追加:在列表末尾添加一个元素。
1 | my_list = [1,2,3,4] |
要向列表添加新元素,可以使用以下方法使用append方法。
1 | my_list.append(5) |
添加新元素的默认位置总是在(length+1)位置。
Insert:使用Insert方法克服了append的限制。使用insert,我们可以显式地定义新元素插入的确切位置。
插入(索引,对象)的方法描述符。它接受两个参数,首先是要插入元素的索引,其次是元素本身。
1 2 3 4 | Example: my_list = [1,2,3,4] my_list[4, 'a'] my_list [1,2,3,4,'a'] |
扩展:当我们想要将两个或多个列表连接成一个列表时,这是非常有用的。如果不使用extend,如果我们想连接两个列表,结果对象将包含一个列表列表。
1 2 3 4 5 | a = [1,2] b = [3] a.append(b) print (a) [1,2,[3]] |
如果我们试图在pos 2访问元素,我们会得到一个列表([3]),而不是元素。要连接两个列表,我们必须使用append。
1 2 3 4 5 | a = [1,2] b = [3] a.extend(b) print (a) [1,2,3] |
连接多个列表
1 2 3 4 5 6 | a = [1] b = [2] c = [3] a.extend(b+c) print (a) [1,2,3] |
使用extend('object1','object2','object3') u扩展列表,使其包含所有3个对象。使用append('object'),您将追加到列表1对象。例如假设有L=[1,2,3,4]
1 2 | L.extend([5,6]) will give u:[1, 2, 3, 4, 5, 6] L.append([5,6]) will give u:[1, 2, 3, 4, [5, 6]] |