python - setp - plt text用法




如何在Python中連接兩個列表? (16)

Python >= 3.5替代: [*l1, *l2]

儘管這是一個古老的答案,但通過接受PEP 448引入了另一種替代方案,值得一提。

標題為Additional Unpacking Generalizations的PEP通常在Python中使用星號*表達時減少了一些語法限制; 與它,加入兩個列表(適用於任何迭代)現在也可以完成:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]

#unpack both iterables in a list literal
>>> joinedList = [*l1, *l2]
>>> print(joinedList)
[1, 2, 3, 4, 5, 6]

此功能是為Python 3.5定義的,它尚未反向移植到3.x系列中的以前版本。 在不受支持的版本中,將引發SyntaxError

與其他方法一樣,這也會創建相應列表中元素的淺表副本

這種方法的好處是,你真的不需要列表來執行它,任何可迭代的東西都可以。 正如PEP所述:

這對於將可迭代項加到列表中,如my_list + list(my_tuple) + list(my_range) ,它現在等同於只是[*my_list, *my_tuple, *my_range]可讀方式也很有用。

所以,加上+會由於類型不匹配而引發TypeError

l = [1, 2, 3]
r = range(4, 7)
res = l + r

以下內容不會:

res = [*l, *r]

因為它將首先解包迭代的內容,然後從內容中創建一個list

我如何在Python中連接兩個列表?

例:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

預期結果:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

一個真正簡潔的方式來添加列表是

li = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__,li)

這給了我們

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

作為更多列表的更通用的方法,您可以將它們放入列表中並使用itertools.chain.from_iterable() 1函數,該函數基於THIS答案是平坦化嵌套列表的最佳方式:

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

1.請注意, chain.from_iterable()在python => 2.6中可用。在其他版本中,使用chain(*l)


你也可以使用extend來添加一個list添加另一個list的結尾:

listone = [1,2,3]
listtwo = [4,5,6]
mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

你可以去extend功能。

l1 = [1,2,3]
l2 = [4,5,6]
l1.extend(l2)
print l1

輸出: [1,2,3,4,5,6]


使用Python 3.3+,你可以使用yield

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

或者,如果你想支持任意數量的迭代器:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

在Python中加入兩個列表:

>>> a = [1, 2, 3, 4]
>>> b = [1, 4, 6, 7]
>>> c = a + b
>>> c
[1, 2, 3, 4, 1, 4, 6, 7]

如果你不想要任何重複:

>>> a = [1, 2, 3, 4, 5, 6]
>>> b = [5, 6, 7, 8]
>>> c = list(set(a + b))
>>> c
[1, 2, 3, 4, 5, 6, 7, 8]

如果你想以排序的形式合併這兩個列表,你可以使用heapq庫中的合併功能。

from heapq import merge

a = [1,2,4]
b = [2,4,6,7]

print list(merge(a,b))

如果您不能使用加號運算符( + ),則可以使用__add__函數:

listone = [1,2,3]
listtwo = [4,5,6]

result = list.__add__(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

或者,如果您不喜歡使用dunders ,則可以使用operator導入:

import operator

listone = [1,2,3]
listtwo = [4,5,6]

result = operator.add(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

有人可能會認為這樣更具可讀性。


如果您需要將兩個有序列表與復雜的排序規則合併,您可能必須像下面的代碼一樣自行滾動它(使用簡單的排序規則來進行可讀性:-))。

list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])

您可以使用在list對像上定義的append()方法:

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)

您可以使用集合來獲取唯一值的合併列表

mergedlist = list(set(listone + listtwo))

正如許多人已經指出的那樣,如果需要對兩個列表應用完全相同的處理itertools.chain()就是要走的路。 就我而言,我有一個標籤和一個標籤,這些標籤與另一個標籤不同,所以我需要一些稍微複雜的東西。 事實證明,在幕後itertools.chain()只需執行以下操作:

for it in iterables:
    for element in it:
        yield element

(請參閱https://docs.python.org/2/library/itertools.html ),所以我從這裡獲得了靈感,並沿著這些方向寫了一些內容:

for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')):
    print header + ':'
    for path in iterable:
        [...]
        command = 'cp -r' if os.path.isdir(srcPath) else 'cp'
        print >> SCRIPT , command, flag, srcPath, mergedDirPath
        [...]

這裡要理解的要點是列表僅僅是可迭代的特殊情況,它們是任何其他對象; 並且for ... in python for ... in循環for ... in可以與元組變量一起工作,所以很容易在同一時間循環多個變量。


這個問題直接問到關於加入兩個列表。 但是,即使您正在尋找聯接多個列表的方式(包括加入零列表時的情況),搜索的搜索量也非常高。 考慮這種更通用的方法:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

會輸出:

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

請注意,當a[][[1,2,3]]時,這也能正常工作。

但是,這可以通過itertools更高效地完成:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

如果你不需要list ,但只需要一個迭代,省略list()

更新

Patrick Collins在評論中提出的替代方案也適用於您:

sum(a, [])

import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

輸出:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

list(set(listone) | set(listtwo))

上面的代碼不保留順序,從每個列表中刪除重複(但不是從連接列表中刪除)





list