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



Answers

也可以創建一個生成器,對這兩個列表中的項目進行迭代。 這允許您將列表(或任何可迭代的)鏈接在一起進行處理,而無需將項目複製到新列表中:

import itertools
for item in itertools.chain(listone, listtwo):
   # do something with each list item
Question

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

例:

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

預期結果:

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



如果你想要一個新的列表,同時保留兩個舊列表:

joinedList = []
for i in listOne:
    joinedList.append(i)
for j in listTwo:
    joinedList.append(j)

sorted(joinedList)

return joinedList



這很簡單,我認為它甚至在tutorial

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



正如許多人已經指出的那樣,如果需要對兩個列表應用完全相同的處理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可以與元組變量一起工作,所以很容易在同一時間循環多個變量。




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

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




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

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

這給了我們

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



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



如果您不能使用加號運算符( + ),則可以使用__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]

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




lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]



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

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



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

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, [])



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



Links