2014-09-21 30 views
2

我有一些数据,看起来像这样的字符串:有条件地将字符串转换为一个字典在Python

messagePayload = 'Key1: Value; Key2; Value; Key3: Value 3' 

我一直使用的是什么使一个字典出这个数据是这样的:

messagePayload = dict(item.split(": ") for item in messagePayload.split("; ")) 

但是,有时一个特定的键没有值。例如:

messagePayload = 'Key1: Value; Key2:; Key3: Value;' 

这当然会崩溃。有没有办法过滤掉没有添加到字典中的值的键?

谢谢!

回答

4

你可以添加一个条件的理解:

messagePayload = dict(item.split(": ") for item in messagePayload.split("; ") 
    if len(item.split(': '))>1 
) 

此版本需要你写出来的(和评估)的split两次,每次项目。您可以通过编写表达只有一次做到这一点,但它需要你使用两个嵌套的内涵:

messagePayload = dict(split for split in 
    (item.split(": ") for item in messagePayload.split("; ")) 
if len(split)>1) 
+0

这将是一个很大更具可读性,如果你打破了每一个分成两行,因为做使你水平滚动超过80列。 – abarnert 2014-09-21 01:06:53

+0

噢,我的天啊,它很简单。我一直在努力寻找解决方案的时间很尴尬。谢谢! – tonyk4316 2014-09-21 01:17:11

0

我认为,鉴于剩“;”价值3,双分裂,你可能要考虑只是一个普通的醇”循环:

mp2='Key1: Value; Key2:; Key3: Value;' 
di={} 
for kv in mp2.split("; "): 
    spkv=kv.split(": ") 
    try: 
     di[spkv[0]]=spkv[1].rstrip(';') 
    except IndexError: 
     pass 

print di 
# {'Key3': 'Value', 'Key1': 'Value'}