2016-06-21 75 views
-2

我有一个字符串如何把字符串转换成一个字典在Python

"{a:'b', c:'d',e:''}" 

什么是最便捷的方式,使其向字典

{'a':'b', 'c':'d', 'e':''} 

为什么会产生这么多的人这是重复的this?在发布之前,我已经完成了作业。在认为别人犯了错误之前,请重新考虑你是否错了。谢谢!

+0

这样的字符串的来源是什么? –

+0

@KevinGuan,它不同。 'eval'将为'a'工作:'b''但不是'a:'b'' – Harrison

+0

@ juanpa.arrivillaga:我猜这是一个Javascript对象字面值(_not_ JSON,它需要属性名称被引用)。 – ShadowRanger

回答

2

取决于你解析什么的复杂性,这可能是工作:

s = "{a:'b', c:'d',e:''}" 
d = dict([ 
    (x.split(':')[0].strip(), x.split(':')[1].strip("' ")) 
    for x in s.strip("{}").split(',') 
]) 
+1

哇,很酷的答案男人:) – RoadRunner

+1

谢谢:) Python很酷。 – Will

+0

是的,是的,仍然有困难做这样的长时间表达,虽然,尼斯工作的人:) – RoadRunner

0

你也可以做这种方式,即使它不漂亮。它确实取决于你的字符串的结构。是否还有其他类型的字符串字典需要评估?

string = "{a:'b', c:'d',e:''}"[1:-1].split(",") 

d = {} 
for s in string: 
    s = s.strip() 
    key, value = s[0], s[-2] 
    if value.isalpha(): 
     d[key] = value 
    else: 
     d[key] = '' 

print(d) 

输出:

{'e': '', 'a': 'b', 'c': 'd'} 
1

警告根据需要,如果你有一个键映射到你的中间空字符串这种方法是行不通的“字典”。我不会删除这个答案,因为我认为这种方法仍然可以挽救。

这可能比Will的答案稍微普遍一些,但它仍然要依赖于你正在解析的确切结构。如果你的键值对由字母数字组成,你应该没问题。

In [3]: import re 

In [4]: import itertools 

In [5]: my_string = "{a:'b', c:'d',e:''}" 

In [6]: temp = re.findall(r"\w", my_string) 

In [7]: temp = itertools.zip_longest(temp[0::2], temp[1::2], fillvalue = "") 

In [8]: dict(temp) 
Out[8]: {'a': 'b', 'c': 'd', 'e': ''} 

如果你想知道什么是与拉链功能发生的事情,看到这些问题:

Collect every pair of elements from a list into tuples in Python

我以前itertools.zip_longest所以你可以使用的填充值,通过启发:

Pairs from single list

+0

嗯,第二个想法,这将无法按需要工作,如果你有一个关键映射到你的“字典。”那么,它可能仍然有用。 –

+0

为什么downvote? –

+0

看起来像某人低估了每个人。我投给你。 – Harrison

0

你可以通过使用json包实现这个;

import json 
s = '{"a":"b", "c":"d","e":"f"}' 
my_dict = json.loads(s) 
print type(my_dict) 
+1

不适用于问题 –

3

如果这是从可信源(不使用此为一般用户的输入,为eval is not secure;但话又说回来,如果你从潜在恶意用户获取输入您应使用JSON格式改为json module),您可以使用eval

source = """{e: '', a: 'b', c: 'd'}""" 

class identdict(dict): 
    def __missing__(self, key): 
     return key 

d = eval(source, identdict()) 
print(d) 

打印

{'a': 'b', 'c': 'd', 'e': ''} 

这是如何工作的是我们创建了一个新的字典子类identdict定义魔术方法__missing__。该方法被称为查找字典中缺少的键。在这种情况下,我们只是返回键,所以字典将键映射到自己。然后使用identdict实例作为globals参数,sourceevaleval将查找来自globals映射的变量值;因为它是一个identdict,所以访问的每个变量的值现在很方便,现在是变量的名称。

适用于更复杂的字符串作为值,以及任何合适的Python文字语法。

+0

中的字符串尼斯。虽然我的内容只是字母数字,但很好学习新的东西。由于我已经接受了其他答案,我只能为你胜利。欣赏。 – Harrison

+0

@哈里森它总是可以为你改变接受的答案 –

+0

@AnttiHaapala伟大的小黑客!但是这个工作到底如何?我不是很了解这是如何通过'NameError',不应该在字典甚至处理一个缺失的值之前被提出?它是如何返回一个字符串?我在'__missing__'方法中添加了'print(type(key))',并且如果我做了'id [1]'这样的'id''是'identdict',并且如果我做了''类似于'id [x]',其中x没有定义,我得到一个'NameError',并且'__missing__'方法永远不会被调用!显然,我并不完全了解eval内置的功能。 –

0
import re 
str="{a:'b', c:'d',e:''}" 
dict([i.replace("'","").split(":") for i in re.findall(r"(\w+\:'.*?')",str)])