2010-03-19 16 views
5

वहाँ बेतरतीब ढंग से, समारोह में बनाया गया एक सूचीपायथन | एक सूची के तत्वों कैसे जोड़ें बेतरतीब ढंग से

पूर्व करने के लिए तत्वों संलग्न करने के लिए एक रास्ता है:

def random_append(): 
    lst = ['a'] 
    lst.append('b') 
    lst.append('c') 
    lst.append('d') 
    lst.append('e') 
    return print lst 

इस बाहर रखा जाएगा ['a', 'b', 'c', 'd', 'e']

लेकिन मैं चाहता हूँ यह तत्वों को यादृच्छिक रूप से जोड़ने और इस तरह कुछ डालने के लिए: ['b', 'd', 'b', 'e', 'c']

और हाँ एक फ़ंक्शन यादृच्छिक है। shuffle() लेकिन यह एक सूची को shuffles टी एक बार जिसकी मुझे आवश्यकता नहीं है, मैं बस यादृच्छिक आवेषण करना चाहता हूं।

+1

वहाँ दो 'b' माना जाता है ' आउटपुट में एस है? –

+1

पूरी सूची को शफल करना शायद यादृच्छिक आवेषण से अधिक स्केलेबल है। (मुझे नहीं पता कि इस पोस्ट से आपकी ज़रूरतें क्या हैं, सच कहने के लिए।) –

+1

क्या आप इस बारे में अधिक विशिष्ट हो सकते हैं कि यह _random inserts_ कैसे काम करना चाहिए? क्या आप प्राथमिकताओं की संख्या को प्राथमिकता जानते हैं? –

उत्तर

7

आप एक यादृच्छिक स्थिति में एकल डालने प्रदर्शन करने की जरूरत है तो पहले से ही दिए गए तुच्छ exapmle काम करता है:

from random import randrange, sample 

def random_insert(lst, item): 
    lst.insert(randrange(len(lst)+1), item) 

लेकिन यदि आप लंबाई की एक सूची के लिए कश्मीर आइटम सम्मिलित n तो का उपयोग कर की जरूरत है पहले दिया गया कार्य ओ (एन * के + के ** 2) जटिलता है। हालांकि एक से अधिक आइटम डालने रैखिक समय हे में किया जा सकता (एन + k) यदि आप लक्ष्य पदों समय से आगे की गणना करने और एक ही बार में इनपुट सूची को फिर से लिखने:

def random_insert_seq(lst, seq): 
    insert_locations = sample(xrange(len(lst) + len(seq)), len(seq)) 
    inserts = dict(zip(insert_locations, seq)) 
    input = iter(lst) 
    lst[:] = [inserts[pos] if pos in inserts else next(input) 
     for pos in xrange(len(lst) + len(seq))] 
10

यदि आप डुप्लिकेट अनुमति दे रहे हैं, तो (के रूप में उत्पादन इंगित करता है) वास्तव में प्रत्येक आइटम में से एक

>>> from random import randint 
>>> a=[] 
>>> for x in "abcde": 
... a.insert(randint(0,len(a)),x) 
... 
>>> a 
['b', 'a', 'd', 'c', 'e'] 

होने की

>>> from random import choice 
>>> a=[choice("abcde") for x in range(5)] 
>>> a 
['a', 'b', 'd', 'b', 'a'] 
+5

ध्यान दें कि यह ओ (एन^2) है और 'a' populating है तो' random.shuffle' का उपयोग ओ (एन) है। –

+0

@ माइक ग्राहम, संभवतः ओपी आवेषण के बीच सूची के साथ कुछ करना चाहता है, क्योंकि वे शफल का उपयोग नहीं करना चाहते हैं। –

+0

@gnibbler, मुझे वास्तव में यह समझने में कठिनाई होती है कि ओपी विवरण के अनुसार क्या चाहता है। चूंकि पाइथन वसंत जाता है, * अस्पष्टता के सामने, अनुमान लगाने के लिए प्रलोभन से इनकार करते हैं। *। –

6

random.shuffle शायद इस काम के लिए सबसे अच्छा उपकरण है माना जाता है। यह सरल, स्पष्ट और अच्छी तरह से नामित है- यह आपको प्राप्त होने वाले अन्य सुझावों की तुलना में शायद अधिक पठनीय है। इसके अतिरिक्त, इसका उपयोग ओ (एन) है, लेकिन insert (एक ओ (एन) ऑपरेशन का उपयोग करके) एन बार वर्गबद्ध है।

0
from random import choice 

n=10 
seq=['a','b','c','d'] 
rstr=[choice(seq) for i in range(n)] 
संबंधित मुद्दे