2016-07-22 89 views
12

Listelerim var ve listeler oldukça uzun. Listenin sadece birkaç elemanının gösterileceği şekilde nasıl yazdırabilirim? Açıkçası, bunun için özel bir işlev yazabilirim, ancak bunu başarabilecek herhangi bir yerleşik yol veya kütüphane var mı? Örneğin, büyük veri çerçevelerini yazdırırken, pandas güzel bir şekilde kısa bir şekilde yazdırır.Python güzel sözlük listelerini yazdır, uzun listeler kısalt

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']} 

İstenilen çıktı: böyle bir şey: Eğer sorduğun şey .. seçebilirsiniz

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

Ayrıca [ 'repr' modül] (https bakmak isteyebilirsiniz: // docs. python.org/2/library/repr.html) ('Py3’de reprlib'), özellikle' maxlist' ayarı: 'rep = Repr(); rep.maxlist = 3; print rep.repr (obj) 'Şimdi bunu“ pprint ”ile birleştirmek gerçek zorluktur. –

+0

Harika! Bu en iyi cevap ve tam olarak ihtiyacım olan şey. Cevap olarak ekleyebilir misiniz? @LukasGraf – CentAu

+0

Michael Hoff zaten reprlib cevap üzerinde çalışıyor, bu yüzden sadece kısaltmak değil Yani –

cevap

3

, reprlib modül gitmek için yol olacaktır: Güvenli, içi içe geçmiş ve özyinelemeli zarif ve özelleştirilebilir işlenmesini/kendinden referanslı veri yapılarını da yapılmış budur için.

Ancak, reprlib ve pprint modüllerinin birleştirilmesi önemsiz değil, en azından güzel yazdırma yönlerini kesmeden (bazıları) temiz bir şekilde çıkamadım.(Tetikleyiciler bölme

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

Çıktı maxlist=5 ile:

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) 

Çıktı maxlist=3 ile:

Bunun yerine, sadece buradaki/kırpmak gerekli listelerini kısaltmak için PrettyPrinter türetilen bir çözüm ayrı satırlarda listeleri):

{'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', 
      '...']} 

Notlar:

  • Bu kopya listelerin yaratacaktır. Veri yapılarının büyüklüğüne bağlı olarak, bu bellek kullanımı açısından çok pahalı olabilir.
  • listeleri özel vaka ile Bu yalnızca fırsatlar. Dicts, tuples, set, frozensets, ... için bu denklik davranışının uygulanması gerekirdi.
+0

Komik, benzer bir prototip vardı. Ancak sözlüklerin kesilmesini uygulamak için atmanız gereken adımları beğenmedim. Çaba için +1! – mhoff

2

Yazdığım Bu özyinelemeli fonksiyon gelmez

Bu örnek daha iyi ne demek göstermektedir İstediğiniz girinti de istediğiniz kadar

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]) 

Sözlüğünüzün çıktısı:

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

Eğer 'baskı '\' t * (girinti + 1) + str son satırı değiştirirseniz (d [anahtar] [: 2]) + '...'' ben demek ne benzer olacaktır. Listenin tamamını istemiyorsun – CentAu

+0

Oh gotcha, yazdığını sanıyordum ... çünkü sen her şeyi tekrar yazmak istemedin, yanlış anladım! –

6

Sen pprint modülünü kullanabilirsiniz:

pprint.pprint(obj) 

misiniz çıkışı:

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

Ve

pprint.pprint(obj,depth=1) 

misiniz çıkışı:

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

Ve

pprint.pprint(obj,compact=True) 

çıktılayacaktır:

{'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, depth = 1)' ihtiyacım olana en yakın şeydir. Sanırım, listenin sadece ilk elemanını basmak ve daha sonra “…” için geri kalanı koymak için bir yol yok. '{' key_ ': [' EG8XYD9FVN ', ...] '' – CentAu

2

kullanın reprlib. Biçimlendirme o kadar hoş değil, ama aslında kısaltılıyor. oldukça baskı olmasaydı

> 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

Yep. "Kısaltma" kısmı veya özyinelemeli öz benlikleme yapılarıyla uğraşmak tam olarak ne için yapıldığıdır. Ne yazık ki, güzel baskı (yeni çizgiler, girinti, ...) ile nasıl birleştirileceği açık değil. –

4

Sen IPython.lib.pretty kullanabilirsiniz.

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 eski sürümleri için, RepresentationPrinter patlatabilmeler:

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

Neden düşüş var? – mhoff

+0

Muhtemelen internette bazı gerizeler olduğu için – wordsforthewise