我有一些数据,最初看起来像这样,我想在Python2.7中处理这些数据:
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字典需要一个可连接的键,所以我可以通过将id和year连接到一个字符串来转换这个表,并且有一个类似于
{'1_2012':'5','2_2012':'50', ...} 显然,如果您想读出键的各个部分,这并不是很优雅。获得复合密钥字典最简单的方法是什么,它仍然很容易将dump转换成json?
发布于 2015-10-23 09:16:47
tuple是可理解的:
{(1, 2012): 5, (2, 2012): 50,}但是,这个dict不能被dump编辑,在本例中的dict键应该是一个字符串:
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__方法实现不佳的键。
发布于 2015-10-23 09:09:49
您可以使用元组作为键。您可以使用圆括号创建元组,例如(2,2012)是元组。它们是不可变的,因此可以用作切分键:
d = {(1,2012):5, (2,2012):50}您可以索引成元组,就像索引到列表中一样,例如,(1,2012)[1]是2012。
发布于 2015-10-23 09:39:07
为此,我建议使用namedtuple,因为它比标准元组更清晰。
import collections
Key = collections.namedtuple('Key', ['id', 'year'])
data = {Key(id=1, year=2012): 5, Key(id=2, year=2012): 50}https://stackoverflow.com/questions/33298552
复制相似问题