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

السؤال

نشر

لدي قائمة list كبيرة الحجم نوعًا ما وأريد أن أغير ترتيب العناصر الموجودة فيها بشكل عشوائي (أي عمل shuffle للقائمة)، هل أقوم بتوليد index عشوائي لكل عنصر وأقوم بالمرور على كل عنصر يدويًا وتغير ترتيبه؟ أم توجد طريقة أسهل لفعل هذا الأمر؟

ما أسهل طريقة لخلط العناصر بشكل عشوائي في بايثون عشوائيًا؟

 

Recommended Posts

  • 1
نشر

تستطيع ذلك من خلال random.shuffle

import random  # إستيراد
l = list(range(5)) # نولد مصفوفة من أرقام مثلا
print(l) 
# [0, 1, 2, 3, 4] 
random.shuffle(l) # خلط العناصر عشوائياً
print(l) 
# [1, 0, 4, 3, 2]

لاحظ أنك بهذه الطريقة تعدل على المصفوفة الأصلية. هناك دالة أخرى تدعى sample  تقوم بنفس الغرض ولكن بمعايير وطريقة مختلفة. تابع المثال التالي:

l = list(range(5)) # مصفوفة جديدة
print(l)
# [0, 1, 2, 3, 4]
length= len(l)
lr = random.sample(l, length) # في الموقع الاول تأخذ المصفوفة وفي الثاني طول تلك المصفوفة
print(lr)
# [0, 3, 1, 4, 2]
# لاحظ أنها تعيد مصفوفة جديدة ولا  تعدل على الأصلية
print(l)
# [0, 1, 2, 3, 4]
	
  • 1
نشر

تقدم المكتبة Crypto  تابع توليد أرقام عشوائية سريعة، يمكن الاعتماد عليها في بناء تابع سريع لتوليد عينيتين عشوائيتين نستخدمهم ك ترقيم عنصرين للقائمة و نقوم بتبديل القيمة بينهما بذلك بتكرار الخطوة السابقة عدد من المرات سوف نخلط المصفوفة

from Crypto.Random.random import randint  

def myshuffle(numbers, n):
  for i in range(n):
    j=randint(i,n-1)
    numbers[i],numbers[j]=numbers[j],numbers[i]
    return numbers

n = 100000
mylist = list(range(n))
myshuffle(mylist, n)

قيمة j ستكون بين i ونهاية المصفوفة، بحيث لا نبدل نفس العنصر مرتين.

التنصيب 

pip install pycrypto

 

  • 1
نشر

يمكن استعمال مكتبة sklearn للقيام بذلك، عن طريق استعمال التابع shuffle، إن هذا التابع يقدم لنا ميزات غير موجودة في تابع ال shuffle الموجود في المكتبة random.

إحدى هذه الميزات هي القيام بعملية shuffle لمجموعة من المصفوفات مع الحفاظ على التقابل بينهما، مثلا لنفترض أنه لديك مصفوفتين إحداهما تمثل أرقام زبائن و يقابلها مصفوفة ثانية تمثل أسماء هؤلاء الزبائن،فهنا أنت لديك تقابل بين المصفوفتين و عندما تريد القيام بال shuffle يجب عليك الحفاظ على ذلك و هو ما تقوم به هذه المكتبة.

طبعا يمكن تمرير أي عدد من المصفوفات و ستقوم بذلك مع المحافظة على التقابل.

يمكن استعمالها بالشكل التالي:

from sklearn.utils import shuffle

a1 = [1, 2, 3, 4, 5]
a2 = ['name1', 'name2', 'name3', 'name4', 'name5']

new_a1, new_a2 = shuffle(a1, a2)

print(new_a1)
print(new_a2)

طبعا يمكن تمرير أي عدد من المصفوفات نريده.

  • 1
نشر

يمكن ذلك عن طريق استعمال مكتبة random بحيث يتم توليد مؤشرات عشوائية و استعمالها في حفظ العنصر و اضافته الى اللائحة

import random
 
arr=[1,2,3,4,5,6]
n=len(arr)-1
for i in range(n):
    random_index = random.randint(0, n) #خلق قيم عشوائية بين 0 و ن
    temp = arr.pop(random_index)  #  ترجع العنصر الموجود في المؤشر المحدد
    arr.append(temp) # اضافته الى اللائحة
print(arr)

المخرج:

[2, 3, 6, 1, 5, 4]

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...