python - python的dict构造函数是如何处理Mappings的?

标签 python dictionary pandas

dict(mapping) 实际上做了什么?

背景:

Python 的文档建议有 three possible paths在构建 dict 时,其中之一是使用 Mapping

pandas series 在某些方面类似于 dict,并且强制转换为 dict 可以按预期工作:

In [27]: series=pd.Series({'a':2,'b':3})

In [28]: dict(series)
Out[28]: {'a': 2, 'b': 3}

但是当在 ChainMap 中时,这会出错:

In [25]: dict(ChainMap(series))

...我认为这应该等同于第一个表达式,但是...

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/core/index.py in get_value(self, series, key)
   1789         try:
-> 1790             return self._engine.get_value(s, k)
   1791         except KeyError as e1:

pandas/index.pyx in pandas.index.IndexEngine.get_value (pandas/index.c:3204)()

pandas/index.pyx in pandas.index.IndexEngine.get_value (pandas/index.c:2903)()

pandas/index.pyx in pandas.index.IndexEngine.get_loc (pandas/index.c:3843)()

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12265)()

pandas/hashtable.pyx in pandas.hashtable.PyObjectHashTable.get_item (pandas/hashtable.c:12216)()

KeyError: 2

During handling of the above exception, another exception occurred:

IndexError                                Traceback (most recent call last)
<ipython-input-25-ffe959c53a67> in <module>()
----> 1 dict(ChainMap(series))

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/collections/__init__.py in __getitem__(self, key)
    865         for mapping in self.maps:
    866             try:
--> 867                 return mapping[key]             # can't use 'key in mapping' with defaultdict
    868             except KeyError:
    869                 pass

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/core/series.py in __getitem__(self, key)
    555     def __getitem__(self, key):
    556         try:
--> 557             result = self.index.get_value(self, key)
    558 
    559             if not np.isscalar(result):

/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/pandas/core/index.py in get_value(self, series, key)
   1794 
   1795             try:
-> 1796                 return tslib.get_value_box(s, key)
   1797             except IndexError:
   1798                 raise

pandas/tslib.pyx in pandas.tslib.get_value_box (pandas/tslib.c:16375)()

pandas/tslib.pyx in pandas.tslib.get_value_box (pandas/tslib.c:16126)()

IndexError: index out of bounds

FWIW 这确实有效:

In [29]: dict(ChainMap(dict(series)))
Out[29]: {'a': 2, 'b': 3}

...因此 ChainMap 似乎正在调用 dict 未调用的 Series 接口(interface)部分。我不知道是什么,因为我似乎找不到复制 dict(mapping) 功能的 Python 代码。

最佳答案

看起来系列并不是真正的映射...请注意,迭代系列会产生值,而不是键:

>>> list(series)
[2, 3]

collections.ChainMap 依赖于迭代映射应该产生键这一事实。

显然,dict 构造函数不依赖于这个事实(IIRC,它使用 .keys 方法——pandas 返回一个合适的对象)。

关于python - python的dict构造函数是如何处理Mappings的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35442924/

相关文章:

python - rq 信息显示 job_id(无无):?

arrays - 按键对字典进行排序并将其转换为数组

python - 用函数的结果替换值

python-3.x - 使用值列表从数据框中选择行

python - 计算python中日期之间的小时范围

python - Seaborn 热图裁剪 y 轴刻度标签

Python 内存/延迟查找属性装饰器

dictionary - 情感分析词典

c++ - 我以后可以更改 C++ 中映射的排序标准吗?

python - 似乎无法在 Windows 上为 python 2.7 安装 pandas