2011-06-13 18 views
15

मेरा प्रश्न सरल है: "एक सुरुचिपूर्ण तरीके से पाइथन में गतिशील बढ़ती सच्ची तालिका कैसे बनाएं?"पायथन एक गतिशील बढ़ती सच्ची तालिका का निर्माण

n के लिए

= 3

for p in False, True: 
    for q in False, True: 
     for r in False, True: 
      print '|{0} | {1} | {2} |'.format(int(p),int(q), int(r)) 
n के लिए

= 4

for p in False, True: 
    for q in False, True: 
     for r in False, True: 
      for s in False, True: 
       print '|{0} | {1} | {2} | {3}'.format(int(p),int(q), int(r), int(s)) 

मैं एक समारोह जो एक पैरामीटर के रूप n लेता है और तालिका बनाता है करना चाहते हैं, यह आवश्यक नहीं है तालिका मुद्रित करने के लिए, तालिका का प्रतिनिधित्व करने वाली डेटा संरचना को वापस करना ठीक है।

उत्तर

33

उपयोग itertools.product():

n = 3 के लिए
table = list(itertools.product([False, True], repeat=n)) 

परिणाम:

[(False, False, False), 
(False, False, True), 
(False, True, False), 
(False, True, True), 
(True, False, False), 
(True, False, True), 
(True, True, False), 
(True, True, True)] 
+3

यह सुंदर है। – Nobita

+0

यह वास्तव में जाने का तरीका है। उत्तर के लिए सभी को धन्यवाद। मैं इसे यहां वर्णित करता हूं जैसा कि वर्णन किया गया है, लेकिन यहां के तहत कार्यान्वयन देखने और मतदान करने के लायक हैं! – evildead

2

In [7]: [i for i in itertools.product([0,1], repeat=3)] 
Out[7]: 
[(0, 0, 0), 
(0, 0, 1), 
(0, 1, 0), 
(0, 1, 1), 
(1, 0, 0), 
(1, 0, 1), 
(1, 1, 0), 
(1, 1, 1)] 
4

itertools वास्तव में के रूप में बताया गया है जाने का रास्ता है itertools मॉड्यूल पर एक नज़र डालें हर किसी के द्वारा बाहर। लेकिन यदि आप वास्तव में इसके लिए आवश्यक एल्गोरिदम के पागल और बोल्ट देखना चाहते हैं, तो आपको recursive descent देखना चाहिए। यह इस प्रकार से अपने मामले में काम करेगा है:

def tablize(n, truths=[]): 
    if not n: 
     print truths 
    else: 
     for i in [True, False]: 
      tablize(n-1, truths+[i]) 

परीक्षण किया गया, काम कर

आशा इस, मदद करता है

+0

सुंदर, धन्यवाद! – evildead

+0

क्या आप मुझे एक संस्करण दे सकते हैं जो उपज का उपयोग करता है? आगे की समस्याओं के लिए बहुत मददगार होगा :) मुझे स्केल में उपज बहुत पसंद है;) – evildead

+0

अगर आपको 'प्रिंट'' उपज ' – inspectorG4dget

4

सूची comprehensions हैं, निश्चित रूप से अधिक pythonic।

def truthtable (n): 
    if n < 1: 
    return [[]] 
    subtable = truthtable(n-1) 
    return [ row + [v] for row in subtable for v in [0,1] ] 

परिणाम, clairity के लिए इंडेंट:

truthtable(1) 
[ [0], 
    [1] ] 

truthtable(3) 
[ [0, 0, 0], 
    [0, 0, 1], 
    [0, 1, 0], 
    [0, 1, 1], 
    [1, 0, 0], 
    [1, 0, 1], 
    [1, 1, 0], 
    [1, 1, 1] ] 

एक जनरेटर समारोह के रूप में yield साथ:

def truthtable (n): 
    if n < 1: 
    yield [] 
    return 
    subtable = truthtable(n-1) 
    for row in subtable: 
    for v in [0,1]: 
     yield row + [v] 

इसके अलावा बस एक जनरेटर अभिव्यक्ति के लिए एक सरणी समझ से लौटने के बदलते वापसी बनाता है yield संस्करण के जेनरेटर फ़ंक्शन के बराबर टाइप करें:

def truthtable (n): 
    if n < 1: 
    return [[]] 
    subtable = truthtable(n-1) 
    return (row + [v] for row in subtable for v in [0,1]) 
+0

में बदल दिया गया तो यह केवल काम करना चाहिए यदि यह उपज का उपयोग करने जैसा कैसा लगेगा? मैं अजगर में थोडा नया हूँ। – evildead

2

एक आंकड़ा संरचना तालिका का प्रतिनिधित्व लौटने उस मामले range(2 ** n) में सभी की जरूरत है ठीक

है ...। सीमा में प्रत्येक संख्या सत्य तालिका में एक पंक्ति का प्रतिनिधित्व करती है। i संख्या k की बाइनरी प्रस्तुति का तीसरा हिस्सा 1 है और केवल i वें चर तालिका के k वें पंक्ति में सत्य है।

आप एक वास्तविक तालिका चाहते हैं तो आप उपयोग कर सकते हैं:

[ [ ((row >> bit_index) & 1) == 1 for bit_index in range(n)] 
    for bit_index in range(2 ** n) ] 
0

जो यहाँ कच्चे 1-लाइनर्स पसंद करती है?

>>> truthtable = lambda n: [[(v>>i)&1 for i in range(n-1,-1,-1)] for v in range(1<<n)] if n>0 else [[]] 

100% परीक्षण और काम कर रहा है।
(परिणाम कॉपी या पेस्ट नहीं कर सकता है, या कोड के ऊपर, क्योंकि मैं इंटरनेट के लिए फोन पर हूं)

+0

टिप: यदि आप उपज जैसी कार्यक्षमता चाहते हैं, तो सभी ब्रैकेट्स को छोड़ दें (बाकी के अलावा) कोष्ठक के साथ, लैम्ब्डा फ़ंक्शन फिर डबल जनरेटर ऑब्जेक्ट लौटाएगा। – Tcll