2011-10-27 17 views
5

मुझे वास्तव में यह नहीं मिल रहा है। मैंने itertools का उपयोग करने की कोशिश की, सभी प्रकार की लूपिंग की कोशिश की, लेकिन फिर भी मैं जो हासिल करना चाहता हूं उसे हासिल नहीं कर सकता।पायथन: "गतिशील" सूची के सभी संभावित संयोजन

list = [("car", 2), ("plane", 3), ("bike", 1)] 

इस सूची में हर बार अलग है, वहाँ हर बार में 5 अलग अलग वस्तुओं और मैं क्या जरूरत है कुछ इस तरह प्राप्त करने के लिए है हो सकता है:

मैं जैसे सूची है: यहाँ मैं क्या जरूरत है :

car1, plane1, bike1 
car1, plane2, bike1 
car1, plane3, bike1 
car2, plane1, bike1 
car2, plane2, bike1 
car2, plane3, bike1 

मैं वास्तव में खो गया हूं। यह स्पष्ट है कि यह शायद कुछ आसान होगा, लेकिन मैं इसे हल करने में असमर्थ हूं।

उत्तर

7

आप itertools.product() इस्तेमाल कर सकते हैं:

my_list = [("car", 2), ("plane", 3), ("bike", 1)] 
a = itertools.product(*([name + str(i + 1) for i in range(length)] 
         for name, length in my_list)) 
for x in a: 
    print x 

प्रिंट

('car1', 'plane1', 'bike1') 
('car1', 'plane2', 'bike1') 
('car1', 'plane3', 'bike1') 
('car2', 'plane1', 'bike1') 
('car2', 'plane2', 'bike1') 
('car2', 'plane3', 'bike1') 
+0

@SvenMarnach: धन्यवाद! यही वह है जिसकी तलाश में मैं हूं! – Meph

-1

इस तरह कुछ लागू करने के लिए कार्यक्रम की जटिलता बहुत अधिक होगी। तर्क बाहर दोबारा काम ताकि आप जटिलता को कम कर सकते हैं की कोशिश ..

+0

ठीक है, और मामले के बारे में क्या कोई शब्द नहीं है? बस विशिष्ट सीमा की संख्या के सभी संयोजन उत्पन्न करने के लिए? क्या यह वाकई मुश्किल है? मैं सिर्फ पूछ रहा हूं, लेकिन मुझे लगता है कि यह मुश्किल नहीं होना चाहिए। – Meph

+0

@Anuj कृपया अन्य उत्तरों को देखें। यह वास्तव में जटिल है, जटिल नहीं है। – agf

1

आप इसे एक पुनरावर्ती क्रिया के साथ लागू कर सकते हैं:

def combis(ls): 
    if not ls: 
     yield [] 
     return 
    (name, limit) = ls[-1] 
    for start in combis(ls[:-1]): 
     for c in range(1, limit+1): 
     yield start + [(name, c)] 
+0

बहुत पाइथनिक नहीं है। – agf

2

इसे आजमाएं:

L = [("car", 2), ("plane", 3), ("bike", 1)] 
O = [] 
N = [] 
for each in L: 
    O.append(each[0]) 
    N.append(each[1]) 
for each in O: 
    strin = "" 
    for item in N: 
    strin = strin + item + each + "," 

    print strin[:-1] 

चूंकि आपकी सूची में केवल पांच आइटम होंगे, यह एक व्यावहारिक समाधान है।

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