2012-12-14 36 views
23

पाशन नेस्ट मैं अक्सर अपने आप को ऐसा करने लगता है:अजगर मुहावरा

for x in range(x_size): 
    for y in range(y_size): 
     for z in range(z_size): 
      pass # do something here 

वहाँ पायथन में यह करने के लिए अधिक संक्षिप्त तरीका है? मैं

for x, z, y in ... ? : 

उत्तर

38

आप itertools.product उपयोग कर सकते हैं:

>>> for x,y,z in itertools.product(range(2), range(2), range(3)): 
...  print x,y,z 
... 
0 0 0 
0 0 1 
0 0 2 
0 1 0 
0 1 1 
0 1 2 
1 0 0 
1 0 1 
1 0 2 
1 1 0 
1 1 1 
1 1 2 
+0

धन्यवाद। मैं एक अलग मार्ग पर जा रहा था क्योंकि मैं itertools का उपयोग नहीं कर सकता, लेकिन, itertools के लिए प्रलेखन की समीक्षा करने के बाद, यह वही है जो मुझे चाहिए। – cacti

+0

यह ध्यान देने योग्य है कि itertools.product के बारे में महान चीज़ों में से एक यह है कि यह इंटरमीडिएट सूचियां नहीं बना रहा है, जिसमें बहुत सारे एपेंड और दृश्य सरणी आकार और मेमोरी ऑपरेशंस के पीछे शामिल होंगे। इस प्रकार यह संस्करण न केवल सुरुचिपूर्ण है, बल्कि कचरा कलेक्टर पर भी तेज़ और अधिक आसान है! यदि आपका नेस्टेड लूप आपके रनटाइम को ले रहा है, तो इस दृष्टिकोण को प्रोफाइल करने का प्रयास करने लायक है। –

8

की तर्ज पर कुछ की सोच रहा हूँ आप numpy निर्भरता पहले से ही के रूप में मिल गया है, तो numpy.ndindex चाल करना होगा ...

>>> for x,y,z in np.ndindex(2,2,2): 
...  print x,y,z 
... 
0 0 0 
0 0 1 
0 1 0 
0 1 1 
1 0 0 
1 0 1 
1 1 0 
1 1 1 
+0

हम्म ... जाहिर है यह 'itertools.product' जैसा ही है। देखा होगा कि कोई आ रहा है ... :-) – mgilson

+0

मुझे यह समाधान पसंद है! यह वास्तव में संक्षेप में है, हालांकि यह एक अजगर मुहावरे की तुलना में अधिक 'मूर्ख' मुहावरे होगा। – Bakuriu

+7

@ बाकुरीयू - मैं परिप्रेक्ष्य से आया हूं कि 'पायप्टन 'बिना' numpy' के बिना सिर्फ एक चमकदार खिलौना है ... लेकिन मुझे पता है कि सभी का परिप्रेक्ष्य नहीं है :-)। – mgilson

7

itertools.product() का उपयोग करें:

import itertools 
for x, y, z in itertools.product(range(x_size), range(y_size), range(z_size)): 
    pass # do something here 

डॉक्स से:

इनपुट iterables की कार्तीय उत्पाद।

जेनरेटर अभिव्यक्ति में नेस्टेड फॉर-लूप के बराबर।
...

0

यह लूप के अंदर क्या है इस पर निर्भर करता है। यदि सूचियों से निपटना है, तो आप list comprehension

अधिक सामान्य मामले के लिए, this post पर itertools का उपयोग करने में सक्षम हो सकते हैं।