• 0

كيف أفرز قائمة بالاعتماد على قائمة أخرى في بايثون؟

لنفترض أن لدي القائمتين التاليتين:

X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]

أريد أن أفرز X بالاعتماد على قيم من Y أي أن القائمة النهاية ستكون كالتالي:

    ["a", "d", "h", "b", "c", "e", "i", "f", "g"]

فما هي أقصر طريقة لفعل ذلك في بايثون؟

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
  • 0

يمكنك فرز قائمة بالاعتماد على قيم من قائمة أخرى بعدّة طرق في لغة بايثون، فيمكنك على سبيل المثال دمج القائمتين معًا ومن ثم فرزها واستخدام حلقة for للحصول على النتيجة المطلوبة كما في المثال التالي:

>>> yx = zip(Y, X)
>>> yx
[(0, 'a'), (1, 'b'), (1, 'c'), (0, 'd'), (1, 'e'), (2, 'f'), (2, 'g'), (0, 'h'), (1, 'i')]
>>> yx.sort()
>>> yx
[(0, 'a'), (0, 'd'), (0, 'h'), (1, 'b'), (1, 'c'), (1, 'e'), (1, 'i'), (2, 'f'), (2, 'g')]
>>> x_sorted = [x for y, x in yx]
>>> x_sorted
['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']

يمكنك دمج السطور السابقة لتحصل على التعليمة التالية:

[x for y, x in sorted(zip(Y, X))]

ومن الطرق السهلة أيضا تحويل القائمتين إلى قاموس ومن ثم فرز القائمة الأولى بالاعتماد على مفاتيح القاموس كما في المثال التالي:

>>> X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
>>> Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
>>> keydict = dict(zip(X, Y))
>>> X.sort(key=keydict.get)
>>> X
['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']
>>> X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
>>> Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
>>> keydict = dict(zip(X, Y))
>>> X.sort(key=keydict.get)
>>> X
['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']

ويمكنك تحويل الأسطر السابقة إلى سطر واحد بسيط كما في المثال التالي:

>>> X.sort(key=dict(zip(X, Y)).get)

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن