【问题标题】:From a list of string, get a list of dictionaries从字符串列表中,获取字典列表
【发布时间】:2020-05-16 15:38:41
【问题描述】:

我有一个字符串列表,其中包含西班牙食谱的成分及其数量,我想获得一个字典列表,将每种成分、单位和数量分开。

这是列表:

ingredients=[
 '50',
 'ccs',
 'aceite',
 '1',
 'hoja',
 'laurel',
 '\n',
 '1',
 'cabeza',
 'ajos',
 '1',
 'vaso',
 'vino',
 '1,5',
 'kilos',
 'conejo',
 '\n',
...]

我想得到这样的字典:

my_dic=[
{"name":"aceite" ,"qt":50 ,"unit": "ccs"},
{"name":"laurel" ,"qt":1 ,"unit": "hoja"},
{"name":"ajos" ,"qt":1 ,"unit": "cabeza"},
{"name":"vino" ,"qt":1 ,"unit": "vaso"},
{"name":"conejo" ,"qt":1,5 ,"unit": "kilos"}, 
...]

我一直在尝试,但这一切都是一场灾难。 有什么想法吗?

提前致谢!!

【问题讨论】:

  • 那么,对于三个连续项目的每一块,您希望使用这些值生成一个字典吗?你能从这三个项目中产生字典吗?你能把列表切成块吗?你能至少展示你一直在尝试的事情之一吗?
  • 您提到的字典输出结构不正确。那是无效的字典。密钥不能相同。
  • 1.过滤掉'\n' 2. 将列表分成大小为3 的块 3. 简单的列表理解,如[dict(zip(['name','qt','unit'],chunk)) for chunk in list]
  • 我刚刚注意到,您最初的 ingredients 数据包含一些 '\n' 元素,没有任何规则间距。我假设你想忽略那些?您是否考虑过先单独通过以将其从列表中删除?
  • @SaniyaParveez OP 说“一个字典”,但似乎实际上想要一个字典列表。

标签: python arrays string list dictionary


【解决方案1】:

首先,您要从原始列表中删除换行符:

ingredients = [i for i in ingredients if i is not '\n']

然后,每个成分名称是ingredients 列表中从第三个元素开始的每隔三个元素。同样对于数量和单位,分别从第二个和第一个元素开始:

names = ingredients[2::3]
units = ingredients[1::3]
qts = ingredients[::3]

然后,遍历这些列表并构造您指定的数据结构(实际上不是dict,而是dicts 的list):

my_list = []
for i in range(len(names)):
    my_dict = {"name":names[i],"qt":qts[i],"unit":units[i]}
    my_list.append(my_dict)

有很多方法可以压缩以上所有内容,但我写它是为了便于理解。

【讨论】:

    【解决方案2】:

    这不会产生字典,但会提供您在问题中指定的输出:

    # Strip out the \n values (can possibly do this with a .strip() in the input stage)
    ingredients = [value for value in ingredients if value != '\n']
    
    labels = ['qt', 'unit', 'name']
    
    my_dic = [dict(zip(labels, ingredients[i:i+3])) for i in range(0, len(ingredients), 3)]
    

    my_dic 包含:

    [{'qt': '50', 'unit': 'ccs', 'name': 'aceite'},
     {'qt': '1', 'unit': 'hoja', 'name': 'laurel'},
     {'qt': '1', 'unit': 'cabeza', 'name': 'ajos'},
     {'qt': '1', 'unit': 'vaso', 'name': 'vino'},
     {'qt': '1,5', 'unit': 'kilos', 'name': 'conejo'}]
    

    【讨论】:

      【解决方案3】:

      您可以使用filter 清理您的列表以删除\n 字符,然后将其与zip() 一起收集您的项目。这使得快速的两线:

      l = filter(lambda w: w != '\n', ingredients)
      
      result = [{'name': name, 'qt':qt, 'unit': unit} 
                for qt, unit, name  in zip(l, l, l)]
      

      结果:

      [{'name': 'aceite', 'qt': '50', 'unit': 'ccs'},
       {'name': 'laurel', 'qt': '1', 'unit': 'hoja'},
       {'name': 'ajos', 'qt': '1', 'unit': 'cabeza'},
       {'name': 'vino', 'qt': '1', 'unit': 'vaso'},
       {'name': 'conejo', 'qt': '1,5', 'unit': 'kilos'}]
      

      【讨论】:

        【解决方案4】:

        怎么样:

        ingredients = (list)(filter(lambda a: a != '\n', ingredients))
        ing_organized = []
        
        for i in range (0, len(ingredients) , 3):
            curr_dict = {"name": ingredients[i+2] ,"qt": ingredients[i] ,"unit": ingredients[i+1]}
            ing_organized.append(curr_dict) 
        
        

        我刚刚从列表中删除了 '\n' 个元素,因为它们似乎没有意义。

        【讨论】:

        • 这不起作用,因为a.remove("b") 只删除了a"b" 的第一个实例
        猜你喜欢
        • 2011-11-08
        • 1970-01-01
        • 2021-03-17
        • 1970-01-01
        • 2012-01-12
        • 1970-01-01
        • 2022-01-11
        相关资源
        最近更新 更多