python - وتلوين - مقارنة عناصر قائمتين وتحديد الإختلافات بينهما




كيفية تسلسل قائمتين في بايثون؟ (16)

كيف أقوم بتسلسل قائمتين في بايثون؟

مثال:

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

النتيجة المتوقعة:

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

إذا كنت تريد دمج القائمتين في نموذج تم الفرز ، يمكنك استخدام دالة دمج من مكتبة 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]

يمكن للمرء أن يجادل هذا هو قليلا أكثر قابلية للقراءة.


الانضمام إلى قائمتين في بايثون:

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

طريقة موجزة حقا لإضافة قائمة من القوائم

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)


مع Python 3.3+ يمكنك استخدام العائد من :

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]

من الممكن أيضًا إنشاء مولد يكرر ببساطة العناصر الموجودة في كلا القائمتين. يسمح لك هذا بتسلسل القوائم (أو أي منها) معًا لتتم معالجتها دون نسخ العناصر إلى قائمة جديدة:

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

هذا بسيط للغاية ، وأعتقد أنه تم عرضه حتى في tutorial :

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

يمكنك أيضًا استخدام extend لإضافة list إضافة نهاية واحدة أخرى:

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

يمكنك استخدام عامل التشغيل + للجمع بينهما:

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

mergedlist = listone + listtwo

انتاج:

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

يمكنك استخدام مجموعات للحصول على قائمة مدمجة بالقيم الفريدة

mergedlist = list(set(listone + listtwo))

يمكنك الذهاب extend وظيفة.

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

الإخراج: [1,2,3,4,5,6]


يمكنك ببساطة استخدام + أو += المشغل على النحو التالي:

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

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