list python用法 - 如何在Python中連接兩個列表?





matplotlib教學 matplotlib刻度 (21)


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

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

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

例:

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

預期結果:

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



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

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



值得注意的是, itertools.chain函數接受可變數量的參數:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

如果可迭代(元組,列表,生成器等)是輸入,則可以使用from_iterable類方法:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']



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

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]



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]



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



你可以去extend功能。

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

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




您可以使用+運算符來合併它們:

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

mergedlist = listone + listtwo

輸出:

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



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

from heapq import merge

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

print list(merge(a,b))



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




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]



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

mergedlist = list(set(listone + listtwo))



list(set(listone) | set(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, [])



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

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



您可以簡單地使用++=運算符,如下所示:

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

要么:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

另外,如果你想要合併列表中的值是唯一的,你可以這樣做:

c = list(set(a + b))



作為更多列表的更通用的方法,您可以將它們放入列表中並使用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)




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

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




元類的一個用途是自動向實例添加新屬性和方法。

例如,如果你看看Django模型 ,他們的定義看起來有點令人困惑。 看起來好像只是定義了類屬性:

class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

但是,在運行時,Person對象充滿了各種有用的方法。 查看source了解一些神奇的元素。







python list