我有一些词典,我在我的一个包中使用,很容易pandas.Series
。但是,我将它们保留为dicts
只是因为.update
方法,它们都会更改现有值并为dict添加新值。 pandas.Series.update
仅更改值。所以我被迫使用dicts(至少我认为)。
拖动是因为使用打印功能打印时很难读取,因此我想为用户打印更好的打印。我知道如何做到这一点的唯一方法是创建一个仅用于打印dicts的功能,这是我想避免的。有没有什么事情我可以固有地改变dicts,以便在运行一些命令后,每个dict打印得更好?也许甚至可以很快将它们转换成只用于打印的熊猫系列,因为我的dicts非常小。像
这样的东西def _print_dict(self):
print(pd.Series(self))
然后我可以把它扔到某个地方,比如
dict.__print_method__ = _print_dict
如果__print_method__
是打印dicts时打印函数调用的方法。
答案 0 :(得分: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
顺便说一句,dict
是defined 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__
方法。)