代码之家  ›  专栏  ›  技术社区  ›  bkcollection

python:将列表与标题合并到字典

  •  4
  • bkcollection  · 技术社区  · 6 年前

    我想将两个列表合并到一个字典类型中。

    Name = ['John','Mary','Serena','Felicia']
    Data = ['26','179','25','164','29','149','29','167']
    

    Json格式的理想输出

    {"people":[{'Name': 'John',
         'Age': '26',
         'Height': '179'},
    {'Name': 'Mary',
         'Age': '25',
         'Height': '164'}
    {'Name': 'Serena',
         'Age': '29',
         'Height': '149'}
    {'Name': 'Felicia',
         'Age': '29',
         'Height': '167'} ]
    }    
    

    我尝试与 list1 = {k: 'Name' for k in Name} 但是字典 显示“John”=“Name”,与我需要的相反。

    3 回复  |  直到 6 年前
        1
  •  4
  •   Jean-François Fabre    6 年前

    两个嵌套的拉链&切片可以在列表理解中构建dict,作为外部dict的值:

    Name = ['John','Mary','Serena','Felicia']
    Data = ['26','179','25','164','29','149','29','167']
    
    result = {'people':[{'Name' : name, 'Age' : age, 'Height' : height} 
              for name,(age,height) in zip(Name,zip(Data[::2],Data[1::2]))]}
    
    
    print(result)
    

    打印:

    {'people': [{'Name': 'John', 'Height': '179', 'Age': '26'}, {'Name': 'Mary', 'Height': '164', 'Age': '25'}, {'Name': 'Serena', 'Height': '149', 'Age': '29'}, {'Name': 'Felicia', 'Height': '167', 'Age': '29'}]}
    

    如果不想创建“硬”切片,请使用 itertools.islice ,还可以将整数值转换为整数,这避免了以后将整数作为字符串进行字典比较的容易陷阱:

    from itertools import islice
    result = {'people':[{'Name' : name, 'Age' : int(age), 'Height' : int(height)}
              for name,age,height in zip(Name,islice(Data,None,None,2),islice(Data,1,None,2))]}
    

    (还要感谢评论,无需嵌套 zip 声明)

    结果:

    {'people': [{'Height': 179, 'Age': 26, 'Name': 'John'}, 
                {'Height': 164, 'Age': 25, 'Name': 'Mary'}, 
                {'Height': 149, 'Age': 29, 'Name': 'Serena'}, 
                {'Height': 167, 'Age': 29, 'Name': 'Felicia'}]}
    
        2
  •  1
  •   user3483203    6 年前

    使用 zip :

    Name = ['John','Mary','Serena','Felicia']
    Data = ['26','179','25','164','29','149','29','167']
    
    dct = {"people": [{'Name': i, 'Age': j, 'Height': k} for i, j, k in zip(Name, Data[::2], Data[1::2])]}
    print(dct)
    

    输出:

    {'people': [{'Name': 'John', 'Age': '26', 'Height': '179'}, {'Name': 'Mary', 'Age': '25', 'Height': '164'}, {'Name': 'Serena', 'Age': '29', 'Height': '149'}, {'Name': 'Felicia', 'Age': '29', 'Height': '167'}]}
    
        3
  •  1
  •   Mike Peder    6 年前

    这里有一个有趣的方法。

    >>> Name = ['John','Mary','Serena','Felicia']
    >>> Data = ['26','179','25','164','29','149','29','167']
    >>> keys = ['Name', 'Age', 'Height']
    >>> it = iter(Data)
    >>> {'people':[dict(zip(keys,i)) for i in zip(Name, it, it)]}
    

    再紧凑不过了。

    输出

    {'people': [{'Name': 'John', 'Age': '26', 'Height': '179'}, {'Name': 'Mary', 'Age': '25', 'Height': '164'}, {'Name': 'Serena', 'Age': '29', 'Height': '149'}, {'Name': 'Felicia', 'Age': '29', 'Height': '167'}]}