কেন এলোমেলো.স্যাফেল কেউ ফিরিয়ে দেয় না?


90

পাইথনে random.shuffleফিরছেন কেন None?

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> print shuffle(x)
None

পরিবর্তে পরিবর্তিত মানটি কীভাবে পাব None?


এলোমেলো মান নয় তবে তালিকার এলোমেলো পরিবর্তন।
আলভাস


উত্তর:


162

random.shuffle()জায়গায়x তালিকা পরিবর্তন করে ।

পাইথন এপিআই পদ্ধতিগুলি যা স্থানে কোনও কাঠামো Noneপরিবর্তিত করে সাধারণত ফিরে আসে , পরিবর্তিত ডেটা কাঠামো নয়।

আপনি যদি বিদ্যমান বিদ্যমান তালিকার উপর ভিত্তি করে একটি নতুন এলোমেলোভাবে পরিবর্তনযোগ্য তালিকা তৈরি করতে চান, যেখানে বিদ্যমান তালিকাটি যথাযথভাবে রাখা হয়েছে, আপনি random.sample()ইনপুটটির পুরো দৈর্ঘ্য সহ ব্যবহার করতে পারেন :

x = ['foo', 'bar', 'black', 'sheep']
random.sample(x, len(x))     

এছাড়াও আপনি ব্যবহার করতে পারে sorted()সঙ্গে random.random()একটি বাছাই কী-এর জন্য:

shuffled = sorted(x, key=lambda k: random.random())

তবে এটি বাছাই (একটি O (NlogN) অপারেশন), যখন ইনপুট দৈর্ঘ্যের স্যাম্পলিংয়ে কেবল ও (এন) অপারেশনগুলি লাগে ( random.shuffle()সঙ্কুচিত পুল থেকে এলোমেলো মানগুলি অদলবদল করা হয় একই প্রক্রিয়া) takes

ডেমো:

>>> import random
>>> x = ['foo', 'bar', 'black', 'sheep']
>>> random.sample(x, len(x))
['bar', 'sheep', 'black', 'foo']
>>> sorted(x, key=lambda k: random.random())
['sheep', 'foo', 'black', 'bar']
>>> x
['foo', 'bar', 'black', 'sheep']

4
এলোমেলো-মূল্যবান keyফাংশনটি কী সত্যই নিশ্চিত? কিছু দ্রুত বাছাই করা অ্যালগরিদমগুলি যদি তুলনাগুলি স্ব-সামঞ্জস্যপূর্ণ না হয় তবে তা পড়ে যায়। আমি এই কাজটি যেভাবেই দেখতে পাচ্ছি, বাস্তবায়নের উপর নির্ভর করে (সাজসজ্জা-সাজানো-আনকোরোট কেবলমাত্র keyপ্রতিটি উপাদানের উপরে একবার প্রয়োগ করতে হবে তাই ভাল সংজ্ঞায়িত হবে)।
টেরিক

4
@ টোরেক: keyকলযোগ্য সাথে বাছাই করার সময় পাইথন সাজসজ্জা-সাজানো-আনকোটোর ব্যবহার করে । সুতরাং হ্যাঁ, এটি প্রতিটি গ্যারান্টী হিসাবে প্রতিটি মান তাদের র্যান্ডম কী ঠিক একবার দেওয়া হয়।
মার্টিজান পিটারস

37

এই পদ্ধতিটিও কাজ করে।

import random
shuffled = random.sample(original, len(original))

8

ডক্স অনুসারে :

সিকোয়েন্স এক্স জায়গায় পরিবর্তন করুন। Alচ্ছিক আর্গুমেন্ট এলোমেলোনা হল 0-আর্গুমেন্ট ফাংশন যা [0.0, 1.0) এ এলোমেলোভাবে ভাসমান ফিরিয়ে দেয়; ডিফল্টরূপে, এটি ফাংশনটি এলোমেলো ()।

>>> x = ['foo','bar','black','sheep']
>>> from random import shuffle
>>> shuffle(x)
>>> x
['bar', 'black', 'sheep', 'foo']

6

সত্যিই কেন?

1. দক্ষতা

shuffleতালিকায় স্থান পরিবর্তন করে। এটি দুর্দান্ত, কারণ যদি আপনার আর মূল তালিকাটির প্রয়োজন না হয় তবে একটি বৃহত তালিকা অনুলিপি করা খাঁটি ওভারহেড হবে।

2. পাইথোনিক শৈলী

মতে "স্পষ্ট অন্তর্নিহিত বেশী ভালো" নীতিকে pythonic শৈলী তালিকা ফেরার, একটি খারাপ ধারণা হবে কারণ তারপর এক মনে হতে পারে এটা, হয় একটি নতুন এক যদিও এটি আসলে নয়।

তবে আমি এটি পছন্দ করি না!

আপনি যদি না একটি তাজা তালিকা, আপনি ভালো কিছু লিখতে হবে

new_x = list(x)  # make a copy
random.shuffle(new_x)

যা সুন্দরভাবে স্পষ্ট। আপনার যদি এই আইডিয়ামটি ঘন ঘন প্রয়োজন হয় তবে এটি কোনও ফাংশনে আবদ্ধ করুন shuffled(দেখুন sorted) যা ফিরে আসে new_x


2

আমি এই মত এই ধারণাটি নিয়ে আমার আহা মুহুর্তটি পেয়েছিলাম:

from random import shuffle
x = ['foo','black','sheep'] #original list
y = list(x) # an independent copy of the original
for i in range(5):
    print shuffle(y) # shuffles the original "in place" prints "None" return
    print x,y #prints original, and shuffled independent copy

>>>
None
['foo', 'black', 'sheep'] ['foo', 'black', 'sheep']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']
None
['foo', 'black', 'sheep'] ['black', 'foo', 'sheep']
None
['foo', 'black', 'sheep'] ['sheep', 'black', 'foo']

কারণ পাইথন করে "কপি-বাই-মান হল" পাস-বাই-রেফারেন্স = পরিবর্তে ডিফল্ট অনুসারে) stackoverflow.com/a/986495/610569
alvas

2

পাইথন এপিআইগুলি যা কাঠামোগত স্থানে পরিবর্তিত হয় সেগুলি আউটপুট হিসাবে আর দেয় না

list = [1,2,3,4,5,6,7,8]
print(list)

আউটপুট: [1, 2, 3, 4, 5, 6, 7, 8]

from random import shuffle
print(shuffle(list))

আউটপুট: কিছুই নয়

from random import sample
print(sample(list, len(list)))

আউটপুট: [7, 3, 2, 4, 5, 6, 1, 8]


0

random.sample()অন্যের ব্যাখ্যা অনুসারে আপনি বদলানো তালিকাটি ফিরে আসতে পারেন । এটি প্রতিস্থাপন ছাড়াই তালিকা থেকে কে উপাদানগুলিকে নমুনা দিয়ে কাজ করে । সুতরাং আপনার তালিকায় যদি সদৃশ উপাদান থাকে তবে তাদের অনন্য ব্যবহার করা হবে।

>>> l = [1,4,5,3,5]
>>> random.sample(l,len(l))
[4, 5, 5, 3, 1]
>>> random.sample(l,len(l)-1)
[4, 1, 5, 3]
>>> random.sample(l,len(l)-1)
[3, 5, 5, 1]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.