2009-09-25 20 views
11

कहते हैं कि मैं तो जैसे एक सूची है करने देता है:पाइथन में किसी HTML तालिका में सूची को चालू करने का सबसे आसान तरीका?

['one','two','three','four','five','six','seven','eight','nine'] 

और मैं विभिन्न आयामों के HTML तालिका में इस डेटा मोड़ के साथ प्रयोग करना चाहते हैं:

one  two three 
four five six 
seven eight nine 

या

one four seven 
two five eight 
three six nine 

या

one two three four 
five six seven eight 
nine 

क्या कोई ऐसी लाइब्रेरी है जो इसे पागल सूची स्प्लिसिंग या लूप के लिए घोंसला करने की आवश्यकता के बिना संभाल सकती है? मेरी Google खोजों से पता चलता है कि कुछ HTML पुस्तकालय हैं, लेकिन मेरे पास यह देखने के लिए समय नहीं है कि वे टेबल को बहुत अच्छी तरह से संभाल सकते हैं या नहीं। क्या किसी को कभी ऐसा करना पड़ा है? यदि ऐसा है, तो आपने यह कैसे किया?

उत्तर

26

मैं आपकी समस्या को विघटित होगा::

वैकल्पिक रूप से आप की तरह कुछ कर सकता है

  • एक "फ्लैट सूची" को देखते हुए उप-सूचियों की एक सूची जहां उप-सूचियों के हैं उत्पादन दी गई लंबाई और समग्र सूची या तो "पंक्ति प्रमुख" क्रम (आपका पहला और तीसरा उदाहरण) या "कॉलम प्रमुख" (आपका दूसरा उदाहरण) में चलाया जा सकता है;
  • स्ट्रिंग आइटम्स के साथ उपन्यासियों की एक सूची दी गई है, इसमें से एक HTML तालिका उत्पन्न करें।

मुझे लगता है कि दो कार्यों वास्तव में बहुत ही अलग कर रहे हैं और वहाँ (और कम करने के लिए बहुत) उन्हें mushing में हासिल करने के लिए कुछ भी नहीं है, इसलिए यदि किसी भी अच्छी तरह से डिजाइन पुस्तकालय ऐसे mushing किया मैं चकित हो जाएगा।

def row_major(alist, sublen):  
    return [alist[i:i+sublen] for i in range(0, len(alist), sublen)] 

और कॉलम-प्रमुख है कि बुरा नहीं:

बिंदु 1 के लिए, पंक्ति-प्रमुख आसान है

def col_major(alist, sublen): 
    numrows = (len(alist)+sublen-1) // sublen 
    return [alist[i::sublen] for i in range(numrows)] 
उदाहरण के लिए

...:

L = ['one','two','three','four','five','six','seven','eight','nine'] 
for r in row_major(L, 3): print r 
print 
for r in col_major(L, 3): print r 
for r in row_major(L, 4): print r 

का उत्पादन आपके तीन वांछित परिणाम (प्रति पंक्ति एक सूची, HTML फॉर्म में अभी तक नहीं ;-)। आप एक ही स्ट्रिंग के रूप में इसे पाने के बजाय इसे बाहर प्रिंट करना चाहते हैं

def html_table(lol): 
    print '<table>' 
    for sublist in lol: 
    print ' <tr><td>' 
    print ' </td><td>'.join(sublist) 
    print ' </td></tr>' 
    print '</table>' 

, प्रत्येक print बदलने के लिए: -

समस्या की दूसरी छमाही तार की सूची की एक सूची से एक HTML तालिका का उत्पादन yield में और '\n'.join(html_table(lol)) का उपयोग करें।

अब आपके पास दो सरल, उपयोगी, उपयोग करने योग्य और पुन: प्रयोज्य बिल्डिंग ब्लॉक हैं - जब भी आप अपना डेटा कुछ भी के रूप में प्रस्तुत करना चाहते हैं, लेकिन जब भी सूची-सूची-सूची हो, तो उन्हें अलग करना होगा। एक HTML तालिका के रूप में मौजूद इसे बनाने के किसी भी अन्य तरीके से आता है।उन्हें एक साथ लाना आपके आवेदन कोड में करने के लिए आसान है, लेकिन निश्चित रूप से यह भी एक सरल "गोंद दिनचर्या", जैसे ऐसा करना आसान है, html_table की yield आधारित संस्करण संभालने और एक एकल स्ट्रिंग परिणाम वांछित है कि:

def list_to_html_table(alist, sublength, column_major=False): 
    if column_major: 
    lol = col_major(alist, sublength) 
    else: 
    lol = row_major(alist, sublength) 
    return ''.join(html_table(lol)) 

नहीं है इस इमारत ब्लॉक mushed-अप गोंद के बड़े धब्बे के मामले में, वास्तव में अच्छे और अधिक सुखद दृष्टिकोण, साथ ही और अधिक उत्पादक के रूप में प्रोग्रामिंग की तुलना में ...? -)

2

वैसे वहां कई टेम्पलेटिंग लाइब्रेरी हैं (गेंशी मुझे पसंद है लेकिन कई अन्य हैं)। दो भागों में

def print_table(data, row_length): 
    print '<table>' 
    counter = 0 
    for element in data: 
     if counter % row_length == 0: 
      print '<tr>' 
     print '<td>%s</td>' % element 
     counter += 1 
     if counter % row_length == 0: 
      print '</tr>' 
    if counter % row_length != 0: 
     for i in range(0, row_length - counter % row_length): 
      print '<td>&nbsp;</td>' 
     print '</tr>' 
    print '</table>' 
+0

ओपी लूप के लिए नेस्टेड से बचना चाहता था। तो नक्शा (लैम्बडा) के लिए एक परिचय हो सकता है क्रम में। – whatnick

+2

@ व्हाटनिक - क्या आप लूप के अंदर एक लूप देखते हैं? मैं नही। –

+0

बस एक ही लूप। – whatnick

0

शायद हेरफेर टेम्पलेट आसान है खिलौने कोड के लिए, = पी

def get_html_tbl(seq, col_count): 
    if len(seq) % col_count: 
     seq.extend([''] * (col_count - len(seq) % col_count)) 
    tbl_template = '<table>%s</table>' % ('<tr>%s</tr>' % ('<td>%s</td>' * col_count) * (len(seq)/col_count)) 
    return tbl_template % tuple(seq) 
3

बस भविष्य के संदर्भ के लिए, मैंने आसान HTML तालिका निर्माण प्रदान करने के लिए सरलटेबल नामक एक छोटा पायथन मॉड्यूल लागू किया। यह भी इस प्रश्न में वर्णित मुद्दे से संबंधित है।

उपयोग नीचे के रूप में के रूप में सरल है:

import simpletable 

test_data = [str(x) for x in range(20)] 
formatted_data = simpletable.fit_data_to_columns(test_data, 5) 
table = simpletable.SimpleTable(formatted_data) 
html_page = simpletable.HTMLPage(table) 
html_page.save("test_page.html") 

चूंकि यह तीसरे पक्ष के संकुल की आवश्यकता नहीं है, तो आप सिर्फ कोड my repository से मिलता है और अपनी परियोजनाओं में उपयोग कर सकते हैं।

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

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