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

السؤال

نشر

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

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

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

Recommended Posts

  • 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)
  • 0
نشر

يمكن إنجاز ذلك بسطر واحد فقط من خلال الدالة sort_together المصممة خصيصاً لهذا:

from more_itertools import sort_together
X = ["r", "s", "t", "u", "v", "w", "x", "y", "z"]
Y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
s = sort_together([Y, X])[1]
print(list(s))

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

A = ["r", "s", "t", "u", "v", "w", "x", "y", "z"]
B = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
result_list = [i for _,i in sorted(zip(B,A))]
print(result_list)

الخرج:

['r', 'u', 'y', 's', 't', 'v', 'z', 'w', 'x']

حيث نستخدم دالة zip لإنشاء كائن ثالث من خلال الجمع بين القائمتين المحددتين. أي الأولى التي يجب فرزها والثانية التي يعتمد عليها الفرز.
يمكننا بعد ذلك استخدام الدالة Sorted، التي تستخرج العناصر الأولى من كل زوج من القوائم المعينة من القائمة التي تم فرزها وتنفيذ zipped عليها.

يمكنك أيضًا استخدام argsort:

A = ["r", "s", "t", "u", "v", "w", "x", "y", "z"]
B = [ 0,   1,   1,    0,   1,   2,   2,   0,   1]
import numpy
A = numpy.array(A)
B = numpy.array(B)
inds = B.argsort()
sorted_a = A[B]
print(sorted_a)

 

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...