首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用复合主键将表映射到python字典

使用复合主键将表映射到python字典
EN

Stack Overflow用户
提问于 2015-10-23 09:03:25
回答 3查看 3.5K关注 0票数 3

我有一些数据,最初看起来像这样,我想在Python2.7中处理这些数据:

代码语言:javascript
运行
复制
id  year    value
1   2012    5
2   2012    50
3   2012    500
1   2013    6
2   2013    60
3   2013    600
1   2014    7
2   2014    70
3   2014    700

我可以很容易地将它转换成类似于这个[[1,2012,5],[2,2012,6],...]的列表。

我想把它转换成字典,因为我想查找固定的id和/或year的所有不同值(如果这个想法不是很好,我宁愿把它作为一个列表,请在注释中告诉我)。

我知道python字典需要一个可连接的键,所以我可以通过将idyear连接到一个字符串来转换这个表,并且有一个类似于

代码语言:javascript
运行
复制
{'1_2012':'5','2_2012':'50', ...} 

显然,如果您想读出键的各个部分,这并不是很优雅。获得复合密钥字典最简单的方法是什么,它仍然很容易将dump转换成json?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-23 09:16:47

tuple是可理解的:

代码语言:javascript
运行
复制
{(1, 2012): 5, (2, 2012): 50,}

但是,这个dict不能被dump编辑,在本例中的dict键应该是一个字符串:

代码语言:javascript
运行
复制
import json
import ast

# Works if keys satisfy following requirement:
# key == ast.literal_eval(repr(key))
# This is true for tuples having numbers inside.

def dumps(d):
    return json.dumps({repr(key): value for key, value in d.items()})

def loads(s):
    d = json.loads(s)
    return {ast.literal_eval(key): value for key, value in d.items()}

这对函数应该一直使用,直到您开始使用足够复杂和/或其__repr__方法实现不佳的键。

票数 3
EN

Stack Overflow用户

发布于 2015-10-23 09:09:49

您可以使用元组作为键。您可以使用圆括号创建元组,例如(2,2012)是元组。它们是不可变的,因此可以用作切分键:

代码语言:javascript
运行
复制
d = {(1,2012):5, (2,2012):50}

您可以索引成元组,就像索引到列表中一样,例如,(1,2012)[1]2012

票数 3
EN

Stack Overflow用户

发布于 2015-10-23 09:39:07

为此,我建议使用namedtuple,因为它比标准元组更清晰。

代码语言:javascript
运行
复制
import collections
Key = collections.namedtuple('Key', ['id', 'year'])
data = {Key(id=1, year=2012): 5, Key(id=2, year=2012): 50}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33298552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档