2016-06-09 60 views
1

我有一些字典,我用在我的包,可以很容易地pandas.Series s。但是,我只是因为.update方法而将它们留为dicts,这两个方法都会更改现有值并为该字典添加新值。 pandas.Series.update只更改值。所以我不得不使用字典(至少我认为)。如何打印字典作为熊猫。系列

拖动是当您使用打印功能打印它们时难以阅读的字符,所以我想将它们更好地打印给用户。我知道如何做到这一点的唯一方法是创建一个专门用于打印字典的函数,我想避免这个问题。有没有办法,我可以固有地改变字典,以便在运行一些命令之后,每个字典都打印得更好?也许甚至可以迅速将它们转换成只用于打印的pandas系列,因为我的字典非常小。喜欢的东西

def _print_dict(self): 
    print(pd.Series(self)) 

,然后我可以扔在某个地方,如

dict.__print_method__ = _print_dict 

如果__print_method__是,打印功能打印类型的字典时调用该方法。

+3

我不跟这些东西,所以我有经验只是将其作为评论发布:据我所知,您正在寻找'__str__'方法。如果你定义了一个从dict继承的新类,你可以将它的'__str__'方法改为'def __str __(self):return pd.Series(self).__ str __()'虽然可能没有必要将它转换为Series 。也许查找方法和修改字典可能会更有效。 – ayhan

+0

你说得对,那是正确的方法。不过,我不知道如何修改或替换它。在你定义之后,我尝试了'dict .__ str__ = __str__',但显然我不能设置字典类型的属性。我也不确定你的意思是从字典继承的新类。 – TomCho

+0

请尝试[此答案](http://stackoverflow.com/a/10493071/5276797)。 – IanS

回答

3

在Python3中,print是一个函数。在Python2.7中,print是一个声明,但如果您在脚本的顶部声明from __future__ import print_function,则print将成为函数。有可能重新定义功能:

from __future__ import print_function 
import pandas as pd 
try: import builtins 
except ImportError: import __builtin__ as builtins 

def print(*args, **kwargs): 
    args = [item if not isinstance(item, (dict,)) else pd.Series(item) 
      for item in args] 
    builtins.print(*args, **kwargs) 


print({'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'}) 
print(2,3,4, sep=' -- ') 

产生

cheese  stilton 
ride  coconuts 
swallow  african 
dtype: object 
2 -- 3 -- 4 

顺便说一句,dictdefined in C。特别是其__repr__defined in C。当__str__ method is empty,__repr__默认情况下用于生成对象的字符串表示形式。

C-定义的对象的特殊方法,如__str____repr__不能monkeypatched:

dct = {'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'} 
def mystr(self): 
    return str(pd.Series(self)) 

dct.__str__ = mystr 

引发

AttributeError: 'dict' object attribute '__str__' is read-only 

如果dct是一个Python定义的类的一个实例,那么故事会有所不同。这些类的特殊方法可以被定义,覆盖或monkeypatched:

import pandas as pd 
class MyDict(dict): 
    def __str__(self): 
     return str(pd.Series(self)) 

dct = {'cheese':'stilton', 'swallow':'african', 'ride':'coconuts'} 
mydct = MyDict(dct) 
print(mydct) 

产生

cheese  stilton 
ride  coconuts 
swallow  african 
dtype: object 

而是利用这需要所有类型的字典更改为MyDicts。这比重新定义print函数要困难得多。

(顺便说一句,当心有hidden pitfalls to subclassing dict properly。例如,如果你重新定义__setitem__但不update,然后update不会叫你__setitem__方法。)

+0

我看到你已经改善了你的答案。请查看我对我自己问题的最新评论。我觉得打印功能对于一个简单的问题来说是一个相当具有侵略性的解决方案。但是,再次,我不是一个专业的程序员。请问你有什么看法? – TomCho

+0

更改'print'功能是有创意的。 Monkeypatching“dict .__ str ___”也可能是侵入性的 - 如果它甚至可能的话,那不是。我能想到的唯一另一个解决方案需要将每个字典更改为“MyDict”。这可能是非常困难的,特别是如果其他功能(甚至可能是你不控制的功能)返回字符。总的来说,我怀疑使用'MyDict'会比重新定义'print'需要对脚本进行更为有害的更改。因此,无论是否具有侵入性,我认为没有比重新定义“打印”更好的选择来达到您所说的目标。 – unutbu

+0

我明白了。 MyDict的问题(这将是我的首选方法)甚至不是我应该从'dict'更改为'MyDict'的事实(从我设置代码的方式来看,这并不困难)。事实上,许多字典(因此MyDict)方法仍然会返回一个字典。例如'copy'方法。考虑到你所说的一切,我可能会用不同的方法变得更好,也许可以使用“pandas.Series”而不是dict或MyDict,并定义一个方法作为dict的'update'方法。 – TomCho