2015-11-25 12 views
6

में एक सूची से एक यादृच्छिक sublist निकाला जा रहा है मैं एक अजगर शब्दकोश है:इस प्रकार अजगर

{'APPLE_PROVIDERS' : ["some", "provider","can","be", "null"], 
    .... 
} 

क्या मैं करना चाहता हूँ सूची में से एक यादृच्छिक sublist एक कुंजी के (जो एक मान है) प्राप्त है। सिर्फ एक तत्व नहीं, बल्कि एक पूरी तरह यादृच्छिक sublist। यहाँ मैं क्या करने की कोशिश की है:

a_list = a_dict.get('APPLE_PROVIDERS', "") 
for item in a_list[randrange(0,len(a_list)) : randrange(0,len(a_list))]: 
    ...do something.. 

यह बात दो समस्याएं हैं:

  1. (0,0) तो सूची खाली है, या यदि dict देखने में विफल रहता है, इस कार्यक्रम में विफल रहता है के बाद से randrange है तर्क के रूप में, जिसके परिणामस्वरूप

  2. कई बार दोनों randrange() कॉल समान संख्या उत्पन्न करते हैं, खासकर जब सूची छोटी होती है। यह एक खाली सूची देता है। उदाहरण के लिए a_list [5: 5]

तो ऊपर दिए गए मामलों के साथ यादृच्छिक उपन्यास प्राप्त करने का सबसे अच्छा तरीका क्या है? इसके अलावा, मुझे आदेश के बारे में परवाह नहीं है। कुछ भी काम करता है। मैं सिर्फ 0,1 के एक पूरी तरह से यादृच्छिक sublist चाहते हैं ... जब तक लूप शुरू होता है हर बार लेन (a_list) तत्वों तक।

यदि सूची किसी अन्य डेटा संरचना में बदला जा सकता है जो समान तत्व रख सकता है, जो मेरे लिए भी काम करता है।

+0

के possiblity नहीं चाहते हैं, तो: आप मूल सूची से सटे तत्वों की एक अनियमित रूप से चुने अनुक्रम करना चाहते हैं? – dhke

+0

अपने यादृच्छिक उपन्यास में, क्या तत्व दोहराए जा सकते हैं? आपकी यादृच्छिक उपन्यास कितनी लंबाई होनी चाहिए? – imp9

उत्तर

11

इसका नमूना लें।

>>> random.sample(["some", "provider", "can", "be", "null"], 3) 
['some', 'can', 'provider'] 
>>> random.sample(["some", "provider", "can", "be", "null"], 3) 
['can', 'null', 'provider'] 
>>> random.sample(["some", "provider", "can", "be", "null"], 3) 
['null', 'some', 'provider'] 
+0

मुझे 0,1,2,3..लेन -1 तत्वों का एक उपन्यास चाहिए और न केवल एक विशिष्ट संख्या .. – user775093

+0

क्या आपने किसी और चीज़ के साथ नंबर बदलने की कोशिश की? –

+0

@ user775093, क्या आपको "निष्पक्ष" वितरण की आवश्यकता है? –

0

Ignacio's answer बहुत अच्छा है। आप न्यूनतम अपने कोड को संशोधित करना चाहते हैं, तो आप ऐसा कर सकते हैं:

a_list = a_dict.get('APPLE_PROVIDERS', "") 
if len(a_list) > 1: 
    index1 = randrange(0,len(a_list)-1) 
    index2 = randrange(index1+1,len(a_list)) 
    for item in a_list[index1:index2]: 
     pass #do stuff 

मैं क्या यहाँ दो बातें: 1) मैं अगर a_list एक से अधिक तत्व है देखने के लिए जाँच, और 2) मैं randrange का उपयोग कर सूचकांक उत्पन्न करते हैं, लेकिन इस तरह से दूसरे को पहले से अधिक होने की गारंटी है।

from random import shuffle 

def get_random_sublist(the_dict, key, number): 
    l = the_dict.get(key, []) 
    shuffle(l) 
    return l[:number] 

तो, मैं random.shuffle का उपयोग करेंगे:

+0

'यदि लेन (a_list)' केवल 'if alist' हो सकता है (आपको 'len() 'कॉल बचाता है)। मैं यह भी एक जेनरेटर फ़ंक्शन बनाने का सुझाव दूंगा ('उपज आइटम' के साथ 'पास' को प्रतिस्थापित करें)। – dhke

+0

'अगर a_list'' len (a_list)> 0' के बराबर है, जो समान नहीं है। चाहे 'पास' होना चाहिए 'उपज' ओपी क्या करना चाहता है इस पर निर्भर करता है। –

+0

@ elendia-starman: आह, क्षमा करें, मैं मानसिक रूप से '> 1' पर कदम रखा। और जनरेटर सिर्फ अधिक पाइथनिक है, विशेष रूप से प्रश्न से उपयोग के मामले में दिया गया है। – dhke

0

तो, यह सोचते हैं आप चाहते हैं कि एक खाली सूची लौटे यदि आप एक खाली सूची मिलता है, यहाँ एक उदाहरण समाधान है। यह मुझे एक ऐसे सब्लिस्ट के बारे में पूछने के मुद्दे से बचने की अनुमति देता है जो हमें प्राप्त वास्तविक सूची से बड़ा है।

>>> DICT = {'a' : "1 2 3 4 5".split(), 'b': [], 'c': [1]} 
>>> get_random_sublist(DICT, 'a', 3) 
['4', '1', '2'] 
>>> get_random_sublist(DICT, 'b', 10) 
[] 
1
>>> from random import randint 
>>> left = randint(0, len(L)) 
>>> right = randint(left, len(L)) 
>>> L[left:right] 
['null'] 

आप बस स्पष्ट होना खाली सूचियों

>>> left = randint(0, len(L) - 1) 
>>> right = randint(left + 1, len(L)) 
+1

लेकिन यह यादृच्छिक रूप से नहीं होगा। आप हमेशा एक उपन्यास प्राप्त करेंगे जो मूल सूची के समान अनुक्रम में है। अगर मैं सही तरीके से प्रश्न समझता हूं, तो आपको एक ऐसी सूची प्राप्त करने में भी सक्षम होना चाहिए जो अनुक्रम में नहीं है। –

+0

@GamesBrainiac, दिया गया नमूना कोड एक टुकड़ा पाने का प्रयास कर रहा है। समस्या यह प्रतीत होती है कि टुकड़ा अक्सर खाली होता है (क्योंकि स्लाइस के सिरों को उलट दिया जाता है) –

संबंधित मुद्दे