2010-06-23 10 views
41

में पुनरावृत्ति के साथ उत्पन्न क्रमपरिवर्तन I itertools के बारे में पता है, लेकिन ऐसा लगता है कि यह केवल पुनरावृत्ति के बिना क्रमपरिवर्तन उत्पन्न कर सकता है।पायथन

उदाहरण के लिए, मैं 2 पासा के लिए सभी संभव पासा रोल उत्पन्न करना चाहता हूं। तो मुझे पुनरावृत्ति सहित [1, 2, 3, 4, 5, 6] के आकार 2 के सभी क्रमिक क्रम की आवश्यकता है: (1, 1), (1, 2), (2, 1) ... आदि

यदि संभव हो तो मैं इसे स्क्रैच से लागू नहीं करना चाहता

उत्तर

68

आप Cartesian Product की तलाश में हैं।

गणित में, एक कार्तीय उत्पाद (या उत्पाद सेट) दो सेट के प्रत्यक्ष उत्पाद है।

आपके मामले में, यह {1, 2, 3, 4, 5, 6} x {1, 2, 3, 4, 5, 6} होगा। itertools तुम वहाँ मदद कर सकते हैं:

import itertools 
x = [1, 2, 3, 4, 5, 6] 
[p for p in itertools.product(x, repeat=2)] 
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), 
(2, 4), (2, 5), (2, 6), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (3, 6), 
(4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (4, 6), (5, 1), (5, 2), (5, 3), 
(5, 4), (5, 5), (5, 6), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6)] 

एक यादृच्छिक पासा रोल (एक पूरी तरह से अक्षम तरीके से) प्राप्त करने के लिए:

import random 
random.choice([p for p in itertools.product(x, repeat=2)]) 
(6, 3) 
+0

दुबारा लिखा मेरी पोस्ट। – miku

+5

यह 2 पासा रोल प्राप्त करने का एक बेहद अक्षम तरीका है ... 'random.randint' के लिए दो कॉल सरल और अधिक कुशल होंगे। – EOL

+0

जब आप सभी संभावित जोड़े उत्पन्न नहीं करते हैं तो यादृच्छिक पासा रोल बहुत तेज़ हो जाएंगे: [i) के लिए [random.randint (1,6) xrange (2)] – liori

20

आप क्रमपरिवर्तन के लिए नहीं देख रहे हैं - आप Cartesian Product चाहते हैं। itertools से उपयोग product के लिए:

from itertools import product 
for roll in product([1, 2, 3, 4, 5, 6], repeat = 2): 
    print(roll) 
+1

आप अधिक आसानी से 'उत्पाद (मर, दोहराना = 2)' कर सकते हैं: 'पासा 'सूची की कोई आवश्यकता नहीं है। – EOL

+0

अच्छा बिंदु, धन्यवाद। –

+0

मुझे यह सबसे अधिक पठनीय लगता है। –

2

अजगर 2.7 में और 3.1 वहाँ एक itertools.combinations_with_replacement समारोह है:

>>> list(itertools.combinations_with_replacement([1, 2, 3, 4, 5, 6], 2)) 
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 2), (2, 3), (2, 4), 
(2, 5), (2, 6), (3, 3), (3, 4), (3, 5), (3, 6), (4, 4), (4, 5), (4, 6), 
(5, 5), (5, 6), (6, 6)] 
+4

यह समाधान संयोजन '(2, 1) ',' (3, 2) ',' (3, 1) ', और इसी तरह से खो देता है ... आम तौर पर यह सभी संयोजनों को छोड़ देता है जहां दूसरा रोल कम होता है सबसे पहला। – holroy

-3

यहाँ C# संस्करण है (भले ही अपने अजगर के लिए कहा, एल्गोरिथ्म ही होना चाहिए) संदर्भ के लिए:

नीचे विधि मूल रूप से नहीं लेती है। विभिन्न क्रमपरिवर्तनों को प्राप्त करने के लिए पासा को फेंक दिया जा सकता है। उपर्युक्त प्रश्न के लिए, आकार '2' होना चाहिए।

private void GetAllPermutationsOfDice_Recursive(int size, string currentValue, 
      List<string> values) 
     { 
      if(currentValue.Length == size) 
      { 
       values.Add(currentValue); 
       return; 
      } 
      for(int i = 1; i<=6;i++) 
      { 
       this.GetAllPermutationsOfDice_Recursive(size, currentValue + i, values); 
      } 
     } 

दो बार पासा टॉस करने के लिए, उपरोक्त विधि कहा जा सकता है के रूप में:

public string[] GetAllPermutationsOfDiceOfSize_2() 
     { 
      List<string> values = new List<string>(); 
      this.GetAllPermutationsOfDice_Recursive(2, "", values); 
      return values.ToArray(); 
     } 

इकाई परीक्षण इसी रहे हैं के बाद:

[TestMethod] 
     public void Dice_PermutationsTests() 
     { 
      var v = this.GetAllPermutationsOfDiceOfSize_2(); 
      Assert.AreEqual(36, v.Length); 
      int l = 6; 
      List<string> values = new List<string>(); 
      for(int i = 1; i<=4; i++) 
      { 
       values.Clear(); 
       this.GetAllPermutationsOfDice_Recursive(i, "", values); 
       Assert.AreEqual(l, values.Count); 
       l *= 6; 
      } 
     } 
+0

प्रश्न पाइथन के बारे में नहीं था C – m1k3y3

-1

सबसे पहले, आप करेंगे पहले सूची में itertools.permutations (सूची) द्वारा जेनरेटर को वापस करना चाहते हैं। फिर दूसरी बात, आप नीचे की तरह कुछ डुप्लिकेट को निकालने के सेट() का उपयोग कर सकते हैं:

def permutate(a_list): 
    import itertools 
    return set(list(itertools.permutations(a_list))) 
+0

जिसमें डुप्लिकेट शामिल नहीं है। –

+0

ओपी स्पष्ट रूप से डुप्लिकेट चाहता है –