python - ويكيبيديا - كم تعيش الافعى



أنظف طريقة لإزالة عناصر القائمة المشتركة عبر قوائم متعددة في الثعبان (4)

منذ كنت لا يهتمون النظام، يمكنك بسهولة إزالة التكرارات باستخدام الطرح مجموعة وتحويل العودة إلى القائمة. هنا هو في الوحش بطانة واحدة:

>>> mylist = [
... [1, 2, 3, 4],
... [2, 5, 6, 7],
... [4, 2, 8, 9]
... ]
>>> mynewlist = [list(set(thislist) - set(element for sublist in mylist for element in sublist if sublist is not thislist)) for thislist in mylist]
>>> mynewlist
[[1, 3], [5, 6, 7], [8, 9]]

ملاحظة: هذا ليس فعالا جدا لأنه تتم إعادة نسخ التكرارات لكل صف. إذا كان هذا هو مشكلة أم لا يعتمد على حجم البيانات الخاصة بك.

لدي قوائم من الأرقام. أريد التأكد من أن كل قائمة تحتوي على عناصر فريدة لتلك القائمة بالذات. إي لا توجد تكرارات "مشتركة" عبر أي من البقية.
هذا هو حقا من السهل القيام به مع قائمتين، ولكن قليلا أصعب مع القوائم ن.

e.g.   
mylist = [
[1, 2, 3, 4],
[2, 5, 6, 7],
[4, 2, 8, 9]
]

يصبح:

mylist = [
[1, 3],
[5, 6, 7],
[8, 9]
]

Answer #1

هذا هو الحل الخاص بي، وذلك باستخدام Counter لبناء مجموعة من جميع الأرقام المشتركة، وبعد ذلك فقط لا فرق مجموعة:

from collections import Counter

def disjoin(lsts):
    c = Counter(num for lst in lsts for num in lst)
    common = set(x for x,v in c.items() if v > 1)
    result = []
    for lst in lsts:
        result.append(set(lst) - common)
    return result

مثال:

>>> remove_common(mylist)
[set([1, 3]), set([5, 6, 7]), set([8, 9])]

Answer #2

مجموعة () هو النهج الصحيح. على الرغم من أنك لم يكن لديك لاستخدام قائمة الفهم.

بدون واردات إضافية:

mylist = [
[1, 2, 3, 4],
[2, 5, 6, 7],
[4, 2, 8, 9]
]
>>> result_list = []
>>> for test_list in mylist:
...     result_set = set(test_list)
...     for compare_list in mylist:
...         if test_list != compare_list:
...             result_set = result_set - set(compare_list)
...     result_list.append(result_set)
...
>>> result_list
[set([1, 3]), set([5, 6, 7]), set([8, 9])]

Answer #3
from collections import Counter
from itertools import chain

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

counts = Counter(chain(*map(set,mylist)))

[[i for i in sublist if counts[i]==1] for sublist in mylist]
#[[1, 3], [5, 6, 7, 7], [8, 9]]




set