2013-12-11 44 views
0

我有一個很長的字符串與一些數據...我需要分裂它由&,然後每個由=並從它創建一對像key: value從最後一個分裂...是否有可能沒有大循環?例如:如何拆分兩次?

video_data = video_data.split('&') 
video_data = {key:value for value.split('=') in video_data.iteritems()} 
+0

聽起來像是你實際上是後:'urlparse.parse_qs' –

+0

唐不會爲了不同的目的重用相同的變量名稱。它使代碼更難閱讀。 – jfs

+1

'video_data'從哪裏來?它來自網址嗎?它是百分比編碼的嗎?會不會有重複的(幾個相同的密鑰)? – jfs

回答

6

它看起來像你試圖解析查詢字符串。蟒蛇已經有這樣的方法,並且還可以處理多個值的鍵和自動創建值的鍵 - >列表的字典給你:

from urlparse import parse_qs 

s = 'a=3&b=5&a=4' 
qs = parse_qs(s) 
# {'a': ['3', '4'], 'b': ['5']} 

正如J.F. Sebastian在評論中所指出:

注意:它不僅僅是對分裂和& =例如:

parse_qs("a=%21&b=urlencoded") 
# {'a': ['!'], 'b': ['urlencoded']} 
+1

注意:它不僅在'&'和'='上分割*,例如'parse_qs(「a =%21&b = urlencoded」)' - >'{'a':['!'],'b ':['urlencoded']}'這可能或可能不是OP想要的。我們不知道。 – jfs

+0

@ J.F.Sebastian這是一個很好的觀點 - 如果意見得到清理,我已將它轉移到答案中。 –

2

無論urlparse.parse_qs()urlparse.parse_qsl()願意爲你做這項工作,更好,更快,更有力:

>>> example = 'foo=bar&ham=eggs&answer=42' 
>>> from urlparse import parse_qs, parse_qsl 
>>> parse_qs(example) 
{'answer': ['42'], 'foo': ['bar'], 'ham': ['eggs']} 
>>> parse_qsl(example) 
[('foo', 'bar'), ('ham', 'eggs'), ('answer', '42')] 
>>> dict(parse_qsl(example)) 
{'answer': '42', 'foo': 'bar', 'ham': 'eggs'} 

根據您需要支持多少次在查詢字符串中出現的鍵的次數來使用其中一種。

但你真的想這樣一個字典理解自己做,你需要嵌套調用.split()成一個元組:

video_data = {key: value for item in video_data.split('&') for key, value in (item.split('='),)} 

但同樣的分析是沒有字典的理解只是更容易;使用生成器表達式替代產生鍵值對的序列爲dict()工廠來代替:

video_data = dict(item.split('=') for item in video_data.split('&')) 

演示:

>>> example = 'foo=bar&ham=eggs&answer=42' 
>>> {key: value for item in example.split('&') for key, value in (item.split('='),)} 
{'answer': '42', 'foo': 'bar', 'ham': 'eggs'} 
>>> dict(item.split('=') for item in example.split('&')) 
{'answer': '42', 'foo': 'bar', 'ham': 'eggs'} 
+0

Or:'dict(keyval.split('=')爲keyval in example.split('&'))'而不是用dict-comp –

+0

堅持,如果你期望單個鍵值對,那麼你可以使用: '[pair.partition('=')[:: 2] for data.split('&')]'中的對。 – jfs

+0

@ J.F.Sebastian:我寧願'pair.split('=',1)'而不是步幅,但是。 –