列表方法append()和extend()之间有什么区别?


当前回答

extend()可以与迭代器参数一起使用。这里有一个例子。您希望通过以下方式从列表列表中列出一个列表:

From

list2d = [[1,2,3],[4,5,6], [7], [8,9]]

你想要的

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

您可以使用itertools.chain.from_iterable()来执行此操作。此方法的输出是迭代器。它的实现相当于

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

回到我们的例子,我们可以

import itertools
list2d = [[1,2,3],[4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))

拿到通缉名单。

以下是如何将extend()等效地用于迭代器参数:

merged = []
merged.extend(itertools.chain.from_iterable(list2d))
print(merged)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

其他回答

我希望我能对这个问题做一个有益的补充。如果您的列表存储了一个特定类型的对象,例如Info,这里有一种情况是extend方法不适合的:在for循环中,每次生成一个Info对象并使用extend将其存储到列表中,它将失败。例外情况如下:

TypeError:“Info”对象不可迭代

但如果使用append方法,结果是可以的。因为每次使用extend方法时,它都会将其视为列表或任何其他集合类型,对其进行迭代,并将其放在上一个列表之后。显然,特定的对象无法迭代。

Append一次添加整个数据。整个数据将添加到新创建的索引中。另一方面,extend,顾名思义,扩展当前数组。

例如

list1 = [123, 456, 678]
list2 = [111, 222]

使用append,我们得到:

result = [123, 456, 678, [111, 222]]

在扩展期间,我们得到:

result = [123, 456, 678, 111, 222]

追加“扩展”列表(在适当位置)仅一个项,传递单个对象(作为参数)。

extend将列表(就地)扩展到传递的对象(作为参数)所包含的项目。

对于str对象,这可能会有点混淆。

如果将字符串作为参数传递:append将在末尾添加一个字符串项,但extend将添加与该字符串长度相同的“单个”str项。如果将字符串列表作为参数传递:append仍将在末尾添加单个“列表”项,并且extend将添加与传递列表长度相同的“列表”项。

def append_o(a_list,元素):a_list.append(元素)打印('append:',end='')对于a_list中的项目:打印(项,结束=',')打印()def extend_o(a_list,元素):a_list.exextend(元素)打印('extend:',end='')对于a_list中的项目:打印(项,结束=',')打印()append_o(['ab'],'cd')扩展_ o([‘ab’],‘d’)append_o(['ab'],['cd','ef'])extend_o(['ab'],['cd','ef'])附加(['ab'],['cd'])扩展_ o([‘ab’],[‘cd’])

生产:

append: ab,cd,
extend: ab,c,d,
append: ab,['cd', 'ef'],
extend: ab,cd,ef,
append: ab,['cd'],
extend: ab,cd,

extend(L)通过附加给定列表L中的所有项目来扩展列表。

>>> 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]

extend()可以与迭代器参数一起使用。这里有一个例子。您希望通过以下方式从列表列表中列出一个列表:

From

list2d = [[1,2,3],[4,5,6], [7], [8,9]]

你想要的

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

您可以使用itertools.chain.from_iterable()来执行此操作。此方法的输出是迭代器。它的实现相当于

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

回到我们的例子,我们可以

import itertools
list2d = [[1,2,3],[4,5,6], [7], [8,9]]
merged = list(itertools.chain.from_iterable(list2d))

拿到通缉名单。

以下是如何将extend()等效地用于迭代器参数:

merged = []
merged.extend(itertools.chain.from_iterable(list2d))
print(merged)
>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]