2016-07-22 8 views
12

मेरे पास सूचियों का शब्दकोश है और सूचियां काफी लंबी हैं। मैं इसे इस तरह प्रिंट कैसे कर सकता हूं कि सूची के केवल कुछ तत्व दिखाए जाएंगे? जाहिर है, मैं इसके लिए एक कस्टम फ़ंक्शन लिख सकता हूं लेकिन क्या कोई अंतर्निहित तरीका या पुस्तकालय है जो इसे प्राप्त कर सकता है? उदाहरण के लिए जब बड़े डेटा फ्रेम प्रिंट करते हैं, pandas इसे अच्छी तरह से कम तरीके से प्रिंट करता है।पाइथन सूचियों का सुंदर प्रिंट शब्दकोश, लंबी सूचियों को संक्षिप्त करें

यह उदाहरण बेहतर दिखाता है मैं क्या मतलब है:

obj = {'key_1': ['EG8XYD9FVN', 
    'S2WARDCVAO', 
    'J00YCU55DP', 
    'R07BUIF2F7', 
    'VGPS1JD0UM', 
    'WL3TWSDP8E', 
    'LD8QY7DMJ3', 
    'J36U3Z9KOQ', 
    'KU2FUGYB2U', 
    'JF3RQ315BY'], 
'key_2': ['162LO154PM', 
    '3ROAV881V2', 
    'I4T79LP18J', 
    'WBD36EM6QL', 
    'DEIODVQU46', 
    'KWSJA5WDKQ', 
    'WX9SVRFO0G', 
    '6UN63WU64G', 
    '3Z89U7XM60', 
    '167CYON6YN']} 

वांछित उत्पादन: कुछ इस तरह: कुछ आप के लिए पूछ रहे हैं .. आप चुन सकते हैं

{'key_1': 
    ['EG8XYD9FVN', 'S2WARDCVAO', '...'], 
'key_2': 
    ['162LO154PM', '3ROAV881V2', '...'] 
} 
+1

आप [ 'repr' मॉड्यूल] (https पर एक नज़र लेने के लिए चाहते हो सकता है: // डॉक्स। python.org/2/library/repr.html) (पीई 3 में 'reprlib'), विशेष रूप से' maxlist 'सेटिंग: 'rep = repr(); rep.maxlist = 3; प्रिंट rep.repr (obj) 'अब' pprint' के साथ संयोजन करना असली चुनौती है। –

+0

बहुत बढ़िया! यह सबसे अच्छा जवाब है और वास्तव में मुझे क्या चाहिए। क्या आप उत्तर के रूप में जोड़ सकते हैं? @ लुकासग्राफ – CentAu

+0

ऐसा लगता है कि माइकल हॉफ पहले ही एक रिप्रिलिब उत्तर पर काम कर रहा है, इसलिए मैंने इसे अभी ऊपर उठाया :) –

उत्तर

3

तो यह बहुत मुद्रण के लिए नहीं थे, reprlib मॉड्यूल जाने का रास्ता होगा: सुरक्षित, गहरा नीडिंत और पुनरावर्ती के सुरुचिपूर्ण और अनुकूलन हैंडलिंग/स्वयं को संदर्भित डेटा संरचनाओं यह क्या किया गया है है के लिये।

हालांकि, यह reprlib और pprint मॉड्यूल के संयोजन को बदलता है, कम से कम मैं सुंदर प्रिंटिंग पहलुओं को तोड़ने के बिना एक साफ तरीके से नहीं आ सकता था।

from pprint import PrettyPrinter 


obj = { 
    'key_1': [ 
     'EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', 'R07BUIF2F7', 'VGPS1JD0UM', 
     'WL3TWSDP8E', 'LD8QY7DMJ3', 'J36U3Z9KOQ', 'KU2FUGYB2U', 'JF3RQ315BY', 
    ], 
    'key_2': [ 
     '162LO154PM', '3ROAV881V2', 'I4T79LP18J', 'WBD36EM6QL', 'DEIODVQU46', 
     'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', '3Z89U7XM60', '167CYON6YN', 
    ], 
    # Test case to make sure we didn't break handling of recursive structures 
    'key_3': [ 
     '162LO154PM', '3ROAV881V2', [1, 2, ['a', 'b', 'c'], 3, 4, 5, 6, 7], 
     'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', '3Z89U7XM60', '167CYON6YN', 
    ] 
} 


class CroppingPrettyPrinter(PrettyPrinter): 

    def __init__(self, *args, **kwargs): 
     self.maxlist = kwargs.pop('maxlist', 6) 
     return PrettyPrinter.__init__(self, *args, **kwargs) 

    def _format(self, obj, stream, indent, allowance, context, level): 
     if isinstance(obj, list): 
      # If object is a list, crop a copy of it according to self.maxlist 
      # and append an ellipsis 
      if len(obj) > self.maxlist: 
       cropped_obj = obj[:self.maxlist] + ['...'] 
       return PrettyPrinter._format(
        self, cropped_obj, stream, indent, 
        allowance, context, level) 

     # Let the original implementation handle anything else 
     # Note: No use of super() because PrettyPrinter is an old-style class 
     return PrettyPrinter._format(
      self, obj, stream, indent, allowance, context, level) 


p = CroppingPrettyPrinter(maxlist=3) 
p.pprint(obj) 

maxlist=3 साथ आउटपुट::

{'key_1': ['EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', '...'], 
'key_2': ['162LO154PM', 
      '3ROAV881V2', 
      [1, 2, ['a', 'b', 'c'], '...'], 
      '...']} 

maxlist=5 साथ आउटपुट (चलाता बंटवारे

बजाय, यहाँ एक समाधान है कि बस PrettyPrinter उपवर्गों फसल/आवश्यक के रूप में सूचियों को संक्षिप्त करने के लिए अलग लाइनों पर सूचियां):

{'key_1': ['EG8XYD9FVN', 
      'S2WARDCVAO', 
      'J00YCU55DP', 
      'R07BUIF2F7', 
      'VGPS1JD0UM', 
      '...'], 
'key_2': ['162LO154PM', 
      '3ROAV881V2', 
      'I4T79LP18J', 
      'WBD36EM6QL', 
      'DEIODVQU46', 
      '...'], 
'key_3': ['162LO154PM', 
      '3ROAV881V2', 
      [1, 2, ['a', 'b', 'c'], 3, 4, '...'], 
      'KWSJA5WDKQ', 
      'WX9SVRFO0G', 
      '...']} 

नोट्स:

  • यह प्रतियां सूचियों का पैदा करेगा। डेटा संरचनाओं के आकार के आधार पर, यह स्मृति उपयोग के मामले में बहुत महंगा हो सकता है।
  • यह केवल सूचियों के विशेष मामले से संबंधित है। इस वर्ग के सामान्य उपयोग के लिए समकक्ष व्यवहार को डिक्ट्स, टुपल्स, सेट, फ्रोजनसेट्स ... के लिए लागू किया जाना होगा।
+0

मजेदार, मेरे पास एक समान प्रोटोटाइप था। लेकिन मैंने शब्दकोशों के छंटनी को लागू करने के लिए किए गए कदमों को नापसंद किया। प्रयास के लिए +1! – mhoff

2

यह पुनरावर्ती क्रिया मैंने लिखा है इंडेंटेशन जो आप चाहते हैं

def pretty(d, indent=0): 
    for key in sorted(d.keys()): 
     print '\t' * indent + str(key) 
     if isinstance(d[key], dict): 
      pretty(d[key], indent+1) 
     else: 
      print '\t' * (indent+1) + str(d[key]) 

आपके शब्दकोश का आउटपुट है:

key_1 
    ['EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', 'R07BUIF2F7', 'VGPS1JD0UM', 'WL3TWSDP8E', 'LD8QY7DMJ3', 'J36U3Z9KOQ', 'KU2FUGYB2U', 'JF3RQ315BY'] 
key_2 
    ['162LO154PM', '3ROAV881V2', 'I4T79LP18J', 'WBD36EM6QL', 'DEIODVQU46', 'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', '3Z89U7XM60', '167CYON6YN'] 
+1

यदि आप अंतिम पंक्ति को 'प्रिंट' \ t '* (इंडेंट + 1) + str (डी [कुंजी] [: 2]) +' ... '' में बदलते हैं, तो यह मेरे जैसा ही होगा। पूरी सूची नहीं चाहते – CentAu

+0

ओह गॉचा, मैंने सोचा कि आपने लिखा है ... क्योंकि आप पूरी चीज को फिर से लिखना नहीं चाहते थे, मेरी गलतफहमी! –

6

आप pprint मॉड्यूल इस्तेमाल कर सकते हैं:

pprint.pprint(obj) 

चाहेंगे उत्पादन:

{'key_1': ['EG8XYD9FVN', 
      'S2WARDCVAO', 
      'J00YCU55DP', 
      'R07BUIF2F7', 
      'VGPS1JD0UM', 
      'WL3TWSDP8E', 
      'LD8QY7DMJ3', 
      'J36U3Z9KOQ', 
      'KU2FUGYB2U', 
      'JF3RQ315BY'], 
'key_2': ['162LO154PM', 
      '3ROAV881V2', 
      'I4T79LP18J', 
      'WBD36EM6QL', 
      'DEIODVQU46', 
      'KWSJA5WDKQ', 
      'WX9SVRFO0G', 
      '6UN63WU64G', 
      '3Z89U7XM60', 
      '167CYON6YN']} 

और,

pprint.pprint(obj,depth=1) 

चाहेंगे उत्पादन:

{'key_1': [...], 'key_2': [...]} 

और,

pprint.pprint(obj,compact=True) 

होगा उत्पादन:

{'key_1': ['EG8XYD9FVN', 'S2WARDCVAO', 'J00YCU55DP', 'R07BUIF2F7', 
      'VGPS1JD0UM', 'WL3TWSDP8E', 'LD8QY7DMJ3', 'J36U3Z9KOQ', 
      'KU2FUGYB2U', 'JF3RQ315BY'], 
'key_2': ['162LO154PM', '3ROAV881V2', 'I4T79LP18J', 'WBD36EM6QL', 
      'DEIODVQU46', 'KWSJA5WDKQ', 'WX9SVRFO0G', '6UN63WU64G', 
      '3Z89U7XM60', '167CYON6YN']} 
+0

'pprint.pprint (obj, गहराई = 1) 'मुझे जो चाहिए वह सबसे नज़दीकी चीज है। मुझे लगता है कि सूची के पहले तत्व को मुद्रित करने के लिए एक अंतर्निहित तरीका नहीं है और फिर बाकी के लिए '...' डाल दिया गया है। जैसे '{' key_ ': [' EG8XYD9FVN ', ...] ' – CentAu

2

उपयोग reprlib। स्वरूपण इतना सुंदर नहीं है, लेकिन यह वास्तव में संक्षेप में है।

> import repr 
> repr.repr(map(lambda _: range(100000), range(10))) 
'[[0, 1, 2, 3, 4, 5, ...], [0, 1, 2, 3, 4, 5, ...], [0, 1, 2, 3, 4, 5, ...], [0, 1, 2, 3, 4, 5, ...], [0, 1, 2, 3, 4, 5, ...], [0, 1, 2, 3, 4, 5, ...], ...]' 
> repr.repr(dict(map(lambda i: (i, range(100000)), range(10)))) 
'{0: [0, 1, 2, 3, 4, 5, ...], 1: [0, 1, 2, 3, 4, 5, ...], 2: [0, 1, 2, 3, 4, 5, ...], 3: [0, 1, 2, 3, 4, 5, ...], ...}' 
+0

हाँ। "संक्षेप" भाग, या रिकर्सिव/स्वयं संदर्भ संरचनाओं से निपटने के लिए बिल्कुल वही किया गया है जो इसे बनाया गया था। दुर्भाग्यवश यह स्पष्ट नहीं है कि इसे सुंदर प्रिंटिंग (न्यूलाइन, इंडेंटेशन, ...) के साथ कैसे जोड़ा जाए। –

4

आप IPython.lib.pretty का उपयोग कर सकते हैं।

from IPython.lib.pretty import pprint 

> pprint(obj, max_seq_length=5) 
{'key_1': ['EG8XYD9FVN', 
    'S2WARDCVAO', 
    'J00YCU55DP', 
    'R07BUIF2F7', 
    'VGPS1JD0UM', 
    ...], 
'key_2': ['162LO154PM', 
    '3ROAV881V2', 
    'I4T79LP18J', 
    'WBD36EM6QL', 
    'DEIODVQU46', 
    ...]} 

> pprint(dict(map(lambda i: (i, range(i + 5)), range(100))), max_seq_length=10) 
{0: [0, 1, 2, 3, 4], 
1: [0, 1, 2, 3, 4, 5], 
2: [0, 1, 2, 3, 4, 5, 6], 
3: [0, 1, 2, 3, 4, 5, 6, 7], 
4: [0, 1, 2, 3, 4, 5, 6, 7, 8], 
5: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
6: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...], 
7: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...], 
8: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...], 
9: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, ...], 
...} 

IPython के पुराने संस्करणों के लिए, आप RepresentationPrinter शोषण हो सकता है:

from IPython.lib.pretty import RepresentationPrinter 
import sys 

def compact_pprint(obj, max_seq_length=10): 
    printer = RepresentationPrinter(sys.stdout) 
    printer.max_seq_length = max_seq_length 
    printer.pretty(obj) 
    printer.flush() 
+0

डाउनवोट क्यों? – mhoff

+0

शायद क्योंकि इंटरनेट पर कुछ झटके हैं – wordsforthewise

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