اذهب إلى المحتوى

السؤال

نشر

لدي قائمة بسيطة كالتالي:

x = [0,1,2,4,8,16,32,64,128,512,1024]

كما تلاحظ لا يوجد أي عناصر مكررة في القائمة، وقررت أن أقوم بتحويلها إلى set ولكن عندما قمت بذلك من خلال دالة set وجدت أن ترتيب العناصر قد اختلف وكانت النتيجة كالتالي:

>>> set(x)
{0, 1, 2, 32, 4, 64, 128, 512, 8, 1024, 16}

كيف يمكنني تحويل القائمة إلى set بدون أن أفقد ترتيب العناصر في القائمة؟

Recommended Posts

  • 1
نشر

في الرياضيات يوجد ما يُسمى ب sets و ordered sets (osets):

  • و ال sets هي حاوية من عناصر فريدة و غير مرتبة، أي أن ال sets هي unordered data structure لذلك فهي لا تحفظ الترتيب. (ال sets موجودة ضمن python)
  • أما ال oset فهي حاوية من عناصر فريدة و مرتبة (ال osets غير موجودة في python)

و لكن يمكننا محاكاة وظيفة ال osets باستخدام ال dictionary keys و هي خاصية في python 3.7 فما فوق.

x = [ 0, 1, 2, 4, 8, 16, 32, 64, 128, 512, 1024 ]

oset = dict.fromkeys(x)

list(oset)

# output: [ 0, 1, 2, 4, 8, 16, 32, 64, 128, 512, 1024 ]

أو يمكنك استخادم الدالة sorted كما يلي:

x = [ 0, 1, 2, 4, 8, 16, 32, 64, 128, 512, 1024 ]

oset = sorted(set(x), key=x.index)

 

  • 0
نشر

يوجد مكتبة تدعى  ordered-set يمكن تثبيتها:

pip install ordered-set

ثم استخدامها بالشكل التالي.. سوف تقوم ببناء مجموعة مرتبة:

#تضمين المكتبة 
from ordered_set import OrderedSet

# بناء غرض 
x = [0,1,2,4,8,16,32,64,128,512,1024]
my_numbers = OrderedSet(x)

# عرض العناصر
print(my_numbers)
# OrderedSet([0, 1, 2, 4, 8, 16, 32, 64, 128, 512, 1024])


# فحص وجود عنصر
print(128 in my_numbers) # true
print(333 in my_numbers) # false

 

  • 0
نشر

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

def unique(sequence):
  # إنشاء سيت فارغة
  seen = set()
  # إضافة العناصر بالترتيب بدون تكرار
  return [x for x in sequence if not (x in seen or seen.add(x))]

أو كالآتي

def dedupe(items):
  	# إنشاء سيت فارغة
    seen = set()
    # حلقة لإضافة العناصر بالترتيب وبدون تكرار
    for item in items:
        if item not in seen:
            yield item
            seen.add(item)

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...