[python] वस्तुओं की एक सूची shuffling


Answers

जैसा कि आपने सीखा था कि जगह में शफल समस्या थी। मुझे अक्सर समस्या भी होती है, और अक्सर यह भी भूल जाती है कि सूची को कैसे कॉपी किया जाए। sample(a, len(a)) का उपयोग sample(a, len(a)) नमूना आकार के रूप में len(a) का उपयोग कर समाधान है। पायथन दस्तावेज़ के लिए https://docs.python.org/3.6/library/random.html#random.sample देखें।

random.sample() का उपयोग करके एक साधारण संस्करण यहां दिया गया है जो random.sample() परिणाम को एक नई सूची के रूप में देता है।

import random

a = range(5)
b = random.sample(a, len(a))
print a, b, "two list same:", a == b
# print: [0, 1, 2, 3, 4] [2, 1, 3, 4, 0] two list same: False

# The function sample allows no duplicates.
# Result can be smaller but not larger than the input.
a = range(555)
b = random.sample(a, len(a))
print "no duplicates:", a == list(set(b))

try:
    random.sample(a, len(a) + 1)
except ValueError as e:
    print "Nope!", e

# print: no duplicates: True
# print: Nope! sample larger than population
Question

मेरे पास पाइथन में ऑब्जेक्ट्स की एक सूची है और मैं उन्हें शफल करना चाहता हूं। मैंने सोचा कि मैं random.shuffle विधि का उपयोग कर सकता हूं, लेकिन सूची विफल होने पर यह असफल प्रतीत होता है। क्या ऑब्जेक्ट को घुमाने या इस के आसपास किसी अन्य तरीके के लिए कोई तरीका है?

import random

class a:
    foo = "bar"

a1 = a()
a2 = a()
b = [a1,a2]

print random.shuffle(b)

यह असफल हो जाएगा।




from random import random
my_list = range(10)
shuffled_list = sorted(my_list, key=lambda x: random())

यह विकल्प कुछ अनुप्रयोगों के लिए उपयोगी हो सकता है जहां आप ऑर्डरिंग फ़ंक्शन को स्वैप करना चाहते हैं।




मुझे यह भी लेने में कुछ समय लगा। लेकिन शफल के लिए प्रलेखन बहुत स्पष्ट है:

जगह में शफल सूची एक्स; वापस कोई नहीं।

तो आपको print random.shuffle(b) नहीं करना चाहिए। print random.shuffle(b) । इसके बजाए random.shuffle(b) करें। random.shuffle(b) और फिर print b




यदि आप पहले से ही numpy (वैज्ञानिक और वित्तीय अनुप्रयोगों के लिए बहुत लोकप्रिय) का उपयोग कर रहे हैं तो आप स्वयं को एक आयात बचा सकते हैं।

import numpy as np    
np.random.shuffle(b)
print(b)

http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.shuffle.html




""" to shuffle random, set random= True """

def shuffle(x,random=False):
     shuffled = []
     ma = x
     if random == True:
         rando = [ma[i] for i in np.random.randint(0,len(ma),len(ma))]
         return rando
     if random == False:
          for i in range(len(ma)):
          ave = len(ma)//3
          if i < ave:
             shuffled.append(ma[i+ave])
          else:
             shuffled.append(ma[i-ave])    
     return shuffled



आप इसके लिए जा सकते हैं:

>>> A = ['r','a','n','d','o','m']
>>> B = [1,2,3,4,5,6]
>>> import random
>>> random.sample(A+B, len(A+B))
[3, 'r', 4, 'n', 6, 5, 'm', 2, 1, 'a', 'o', 'd']

यदि आप दो सूचियों पर वापस जाना चाहते हैं, तो आप इस लंबी सूची को दो में विभाजित करें।




यदि आपके पास एकाधिक सूचियां हैं, तो हो सकता है कि आप क्रमपरिवर्तन को परिभाषित करना चाहें (सूची में आइटम को पुन: व्यवस्थित करें / सूची में पुनर्व्यवस्थित करें) पहले और फिर इसे सभी सूचियों पर लागू करें:

import random

perm = list(range(len(list_one)))
random.shuffle(perm)
list_one = [list_one[index] for index in perm]
list_two = [list_two[index] for index in perm]

बेवकूफ / Scipy

यदि आपकी सूचियां numpy arrays हैं, तो यह आसान है:

import numpy as np

perm = np.random.permutation(len(list_one))
list_one = list_one[perm]
list_two = list_two[perm]



योजना: भारी उठाने के लिए लाइब्रेरी पर भरोसा किए बिना शफल लिखें। उदाहरण: तत्व 0 से शुरू होने वाली शुरुआत से सूची के माध्यम से जाएं; इसके लिए एक नई यादृच्छिक स्थिति पाएं, 6 कहें, 0 के मान को 6 और 6 के मान में 0 में रखें। तत्व 1 पर जाएं और इस प्रक्रिया को दोहराएं, और बाकी सूची के माध्यम से

import random
iteration = random.randint(2, 100)
temp_var = 0
while iteration > 0:

    for i in range(1, len(my_list)): # have to use range with len()
        for j in range(1, len(my_list) - i):
            # Using temp_var as my place holder so I don't lose values
            temp_var = my_list[i]
            my_list[i] = my_list[j]
            my_list[j] = temp_var

        iteration -= 1



def shuffle(_list):
    if not _list == []:
        import random
        list2 = []
        while _list != []:
            card = random.choice(_list)
            _list.remove(card)
            list2.append(card)
        while list2 != []:
            card1 = list2[0]
            list2.remove(card1)
            _list.append(card1)
        return _list



Related