将冒号分隔的字符串转换为列表 - 在字典列表中... (Python)

Convert a colon separated string to a list - within a list of dictionaries... (Python)

我有来自数据库的数据,其中 returns 字典列表如下所示:

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(';')

执行此操作的更好方法是什么?

你试试,代码如下,首先我在每个字典中迭代,接下来,我使用 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(";")

你得到:

[{'product': 'car', 'colour': 'blue', 'properties': ['stereo', 'aircon', 'magwheels']},

{'product': 'bus', 'colour': 'red', 'properties': ['microphone', 'aircon', 'dvd']},

{'product': 'motorbike', 'colour': 'black', 'properties': None}]

如果您事先知道必须为其拆分字典值的键,则可以将这些键作为字符串存储在 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(';')

您可以将其作为列表理解中的字典理解来完成:

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

请注意,由于值可以是 None 而不是字符串,因此您可以写 value and value.split(';'),而不仅仅是拆分。

如果您不希望字符串拆分,除非有一个分号可以拆分(对我来说似乎很奇怪,但不管怎样),您必须明确说明

 [ { 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 ]