2012-06-12 59 views
7

我有一個元組,如('key1', 'value1'),我想將它添加到字典中,所以它就像{'key1': 'value1'},但不像dictionary[t[0]] = t[1]那樣做。添加一個2值元組作爲鍵:值

上下文如下,我有一個週期規則,看起來像:

FREQ=WEEKLY;UNTIL=20120620T233000Z;INTERVAL=2;BYDAY=WE,TH 

而且我希望有一個像字典:

recurrence = { 
    'freq' : 'weekly', 
    'until' : '20120620T233000Z', 
    'interval' : '2', 
    'byday' : 'we,th' 
} 

而我做這樣的事情:

for rule in recurrence.split(';'): 
    r = rule.split('=') 
    rules[r[0]] = r[1] 

而且我根本不喜歡它。有沒有更加pythonic的做法呢?

回答

6

使用理解:

rules.update(rule.split('=', 1) for rule in recurrence.split(';')) 

這是如果字典rules已經存在;否則使用

rules = dict(rule.split('=', 1) for rule in recurrence.split(';')) 

這工作,因爲dict構造和dict.update都接受一個迭代器產生的鍵/值對。

+4

'.partition('=')[:: 2]'如果缺少'='有效/可能會被忽略 – jfs

+1

這個評論是我喜歡SO的。當我解開一個缺少如下值的字符串時,我正在尋找一種乾淨的方法來避免「ValueError:字典更新序列元素#2長度爲1; 2是必需的」:'user_id =「123」,access_token =「XXXXXX 」時間戳」。這個評論是一個「啊哈」的時刻,它教會了我一些非常有價值的東西。 –

1

dict函數會將元組元組轉換爲key:value字典。這個怎麼樣,

t=((1,2),(3,4)) 
dict(t) 
{1:2,3:4} 
1

使用字典解析:

>>> strs="FREQ=WEEKLY;UNTIL=20120620T233000Z;INTERVAL=2;BYDAY=WE,TH" 
>>> dic={key: value for key, value in (rule.split("=") for rule in strs.split(";"))} 
>>> print(dic) 

{'BYDAY': 'WE,TH', 'FREQ': 'WEEKLY', 'INTERVAL': '2', 'UNTIL': '20120620T233000Z'} 
+1

這是一個醜陋的做法。或者使用'dict()'構造函數並傳遞已經準備好的元組,或者將解開後的元組封裝到一個嵌套的生成器表達式中:'{key:value for key,value in(rule.split(「=」)for rule in data .split(「;」))}'避免執行很多次操作。 –

+0

@實施了標籤建議。 –