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

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

Fahmy Mostafa

السؤال

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...