2011-04-12 125 views
1

我使用Python 2.5和Win XP。我有一个元组如下:如何将元组转换为字典?

>>> a 
(None, '{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12}') 
>>> a[1] 
'{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12}' 
>>> 

我想将元组a [1]转换为字典,因为我想使用键和值。请帮助建议。 TQ

+0

'A'是一个元组,一个'[1]'已经是一个字典。例如,[1] [4]会给你'8'。 – UncleZeiv 2011-04-12 09:33:22

+1

a [1]是一个字符串,而不是字典。 – euphoria83 2011-04-12 09:35:29

+0

这个元组来自哪里?键和值是否始终为数字? – 2011-04-12 09:36:34

回答

5
>>> import ast 
>>> ast.literal_eval(a[1]) 
{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12} 
+0

的那个,我输入了import ast,但是没有错误,没有ast模块。 – maximus 2011-04-12 09:42:16

+0

@maximus:Python2.5中没有'ast'模块。将[ast.py](http://svn.python.org/view/python/branches/release27-maint/Lib/ast.py?view=markup)置于'sys.path'的某处。 – jfs 2011-04-12 09:44:21

1

如果您信任的a[1]源,你可以使用eval

dictionary = eval(a[1]) 

否则,你可以(在Python 2.5或simplejsonsee here):使用json

import json 
dictionay = json.loads(a[1]) 

注意:它主要取决于你如何得到字符串:如果它来自repr并且不能被破解,eval可能好。 如果它来自json.dumps(这将导致不同的字符串),则应使用json.loads

+0

这可能会起作用,但除非完全相信'a [1]'的内容始终具有正确的格式并且永远不会包含恶意数据,否则它是危险的。鉴于正确的字符串,'eval'可以做任何事情,所以如果任何'a [1]'被严重或恶意生成的机会,请不要对它使用eval。 – 2011-04-12 09:38:24

+1

如果'ast.literal_eval()'[works]不使用'eval'(http://stackoverflow.com/questions/5633095/how-to-convert-tuple-to-dictionary/5633170#5633170)。 'a [1]'不是JSON格式。 – jfs 2011-04-12 09:38:43

+0

你是对的。 a [1]是一个字符串。我刚刚检查过它。 – maximus 2011-04-12 09:38:47

3

首先在逗号分隔字符串。 迭代所有部分。 拆分冒号的每个部分。 将字符串转换为整数。 将第二个整数作为第一个整数的值添加为键。

+0

您也必须在拆分前删除括号 – Don 2011-04-12 09:49:14

0

的字典()构造直接从存储为元组的 键 - 值对的列表构建 字典。当 对形成模式时,列表 解析可以紧凑地指定 键值列表。

字典([( 'SAPE',4139),( '圭多',4127),( '千斤顶',4098)]) { 'SAPE':4139, '千斤顶':4098, 'guido':4127} dict([(x,x ** 2)for x in(2,4,6)])#使用列表理解 {2:4,4:16,6:36}

复制粘贴&来自:http://docs.python.org/tutorial/datastructures.html

+0

hi, >>> a (None,'{1:2,2:4,3:6,4:8,5:10,6:12} ') >>> type(a) >>> a [1] '{1:2,2:4,3:6,4:8,5:10,6: 12}' >>> type(a [1]) 抱歉让您感到困惑。看起来像[1]是一个字符串类型。我如何将str转换为字典? tq – maximus 2011-04-12 09:41:01

+0

对不起,我忽略了这一点。然后你最好用Dons json解决方案,假设你的字符串元组的“语法”类似于json – 2011-04-12 09:45:47

1

还有另一种方法可以做到这一点,而不需要使用任何导入。

简单列表解析(温度):

>>> a 
(None, '{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12}') 
>>> a[1] 
'{1: 2, 2: 4, 3: 6, 4: 8, 5: 10, 6: 12}' 
>>> temp = [[int(c) for c in b.split(":")] for b in a[1].strip('{}').split(",")] 
>>> a_dict = dict(temp) 
>>> a_dict[1] 
2 
>>> a_dict[2] 
4 
+1

您可以使用'a [1] .strip('{}')'去除括号 – Don 2011-04-12 10:17:03

+0

正确,更新了代码。 – lecodesportif 2011-04-12 10:19:16

+0

你可以在'[1] .strip('{}')。split(',')中使用'genexpr'和'dict'构造函数:'dict(map(int,pair.split(“:”)) “))' – jfs 2011-04-12 12:04:07