TheProgrammer نشر 4 ديسمبر 2015 أرسل تقرير نشر 4 ديسمبر 2015 لنفترض أن لدي القائمتين التاليتين: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 هشام رزق الله نشر 4 ديسمبر 2015 أرسل تقرير نشر 4 ديسمبر 2015 يمكنك فرز قائمة بالاعتماد على قيم من قائمة أخرى بعدّة طرق في لغة بايثون، فيمكنك على سبيل المثال دمج القائمتين معًا ومن ثم فرزها واستخدام حلقة 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 Ali Haidar Ahmad نشر 2 أبريل 2022 أرسل تقرير نشر 2 أبريل 2022 يمكن إنجاز ذلك بسطر واحد فقط من خلال الدالة 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) اقتباس
السؤال
TheProgrammer
لنفترض أن لدي القائمتين التاليتين:
أريد أن أفرز X بالاعتماد على قيم من Y أي أن القائمة النهاية ستكون كالتالي:
فما هي أقصر طريقة لفعل ذلك في بايثون؟
2 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.