2015-05-02 89 views
2

我有數據從它返回的字典,看起來像這樣的列表的數據庫來:轉換冒號分隔字符串列表 - 字典列表中...(Python)的

products = [{'product': 'car', 'colour': 'blue', 'properties': 'stereo;aircon;magwheels'}, 
      {'product': 'bus', 'colour': 'red', 'properties': 'microphone;aircon;dvd'}, 
      {'product': 'motorbike', 'colour': 'black', 'properties': None}] 

之前它被傳遞的應用程序中使用,我想冒號分隔字符串轉換到一個列表,這樣的結果會是這樣:

[{'product': 'car', 'colour': 'blue', 'properties': ['stereo', 'aircon', 'magwheels']}, 
{'product': 'bus', 'colour': 'red', 'properties': ['microphone', 'aircon', 'dvd']}, 
{'product': 'motorbike', 'colour': 'black', 'properties': None}] 

我目前通過遍歷所有的項目在做列表,並應用以下邏輯:

for product in products: 
    if product['properties'] is not None: 
     product['properties'] = product['properties'].split(';') 

我要爲字典中的5個按鍵做到這一點,所以基本上我重複這個邏輯5次,一次爲每個關鍵,就像這樣:

for product in products: 
    if product['properties'] is not None: 
     product['properties'] = product['properties'].split(';') 
    if product['blah'] is not None: 
     product['blah'] = product['blah'].split(';') 
    if product['foo'] is not None: 
     product['foo'] = product['foo'].split(';') 

什麼是更好的方式做這個?

+0

爲了澄清,需要此處理的密鑰是一個已知的集合。我無法在所有鍵上運行分割,因爲存在a;可以合法地存在這些密鑰。 – causticsoda

回答

0

如果你事先知道您擁有拆分字典值的鍵,你可以存儲這些鍵,爲字符串,在set

ok2split = set('properties', 'foo', 'blah') 

那麼你可以做轉換如下

new = [{k:(d[k].split(';')if(d[k] and k in ok2split)else d[k])for k in d}for d in products] 

,或者在地方經營,

for d in products: 
    for k in d: 
     if d[k] and k in ok2split: d[k] = d[k].split(';') 
0

你試試,下面的代碼,我首先遍歷每個字典,接下來,我用iteritems的迭代在字典中的每個元素

products = [{'product': 'car', 'colour': 'blue', 'properties': 'stereo;aircon;magwheels'}, 
      {'product': 'bus', 'colour': 'red', 'properties': 'microphone;aircon;dvd'}, 
      {'product': 'motorbike', 'colour': 'black', 'properties': None}] 

for dict_product in products: 
    for key, val in dict_product.iteritems(): 
    if val is not None and val.find(";") != -1: 
     dict_product[key] = val.split(";") 

你:

[{ '產品' :'car','color':'blue','properties':['stereo','aircon','magwheels']},

{'product':'bus','color'紅色','屬性':['麥克風','空調','dvd']},

{「產品」:「摩的」,「色」:「黑」,「性」:無}]

+0

'dict'是一個Python內建函數,你最好使用另一個名字作爲當前字典。 – gboffi

+0

@gboffi我修好了,謝謝 –

0

你可以做到這一點作爲一個列表理解中的字典理解:

[ { key: value and value.split(';') for key, value in product.items() } 
     for product in products ] 

注意,因爲一個值可以是沒有的,而不是一個字符串,你寫value and value.split(';'),而不只是單純的分裂。

如果不希望字符串分割,除非有一個分號分割的(似乎很奇怪,我,但whatevs),你必須這麼說明確

[ { key: value.split(';') 
      if value and ';' in value 
      else value 
    for key, value in product.items() } 
     for product in products ] 

您可能要打破值加工成功能:

def splitOnSemi(value): 
    return (value.split(';') 
      if value and ';' in value 
      else value) 

[ { key: splitOnSemi(value) 
    for key, value in product.items() } 
     for product in products ] 
+0

答案已經編輯。 – Malvolio

相關問題