在字典[Python]

时间:2018-02-13 20:12:42

标签: python list parsing dictionary

目前有一个像这样结构的词典

data =
{
     "Invitees": [
    {
           "firstName": "Will",
           "lastName": "Klein",
           "email": "WKlein@***il.com",
           "highSchool": "NorthwestHS",
           "availableDates": [
               "2018-02-01",
               "2018-02-02"
           ]
     },
     {
           "firstName": "Jack",
           "lastName": "Smith",
           "email": "JSmith@***il.com",
           "highSchool": "SouthwestHS",
           "availableDates": [
                "2018-02-04",
                "2018-01-01"
            ]
     },
     {
           "firstName": "Jamie",
           "lastName": "Farough",
           "email": "JFarough@***il.com",
           "highSchool": "NorthwestHS",
           "availableDates": [
                "2018-02-01",
                "2018-02-02"
           ]
     },
     {
           "firstName": "Bob",
           "lastName": "Saggot",
           "email": "BSaggot@***il.com",
           "highSchool": "NorthwestHS",
           "availableDates": [
               "2018-02-01",
               "2018-02-02"
           ]
     }
  ]
}

我想邀请人们参加为期2天的生日派对,但我必须选择最适合个人的日期(由他们的HS编制索引)。目标是创建一个程序,可以索引字典并返回哪些人可以根据其可用日期(连续2天)参加。现在我创建了一个详细列出每个人信息的列表,但不确定如何按可用日期组合它们。 我有:

for index in range(lengthofDic):
     highSchool.append(data["Attendee"][index]["highSchool"])
     email.append(data["Attendee"][index]["email"])
     availDate.append(data["Attendee"][index]["availableDates"])

其中列出了包含每个人信息的不同列表,但我不知道如何组合和过滤列表以找到适用于同一所学校的人的最佳2个日期。

还尝试使用下面的函数来过滤掉列表中不同值之间的相同日期,但不知道如何为超过2个列表执行此操作:

 for index in range(lengthofDic):
      print (lamda x,y: x in (availableDate[1]), (availableDate[1]))  #availableDate is list containing dates

我想要的输出示例如下:

{
    "Attendee": [
    {
        "aCount": 3,
        "attendees": [
            "BSaggot@***il.com"                
            "JFarough@***il.com"
            "WKlein@***il.com
        ],
        "highSchool": "NorthwestHS",
        "startDate": "2018-02-01"
    },
    {
        "aCount": 0,
        "attendees": [],
        "highSchool": "SouthWestHS,
        "startDate": null
    }

西南高中无法参加,因为该学校的与会者没有连续两天的可用性,因此返回NULL。关于如何构建程序或使用哪些方法的任何建议都将非常感谢!!

1 个答案:

答案 0 :(得分:1)

您可以使用import itertools data = {'Invitees': [{'availableDates': ['2018-02-01', '2018-02-02'], 'lastName': 'Klein', 'highSchool': 'NorthwestHS', 'email': 'WKlein@***il.com', 'firstName': 'Will'}, {'availableDates': ['2018-02-04', '2018-01-01'], 'lastName': 'Smith', 'highSchool': 'SouthwestHS', 'email': 'JSmith@***il.com', 'firstName': 'Jack'}, {'availableDates': ['2018-02-01', '2018-02-02'], 'lastName': 'Farough', 'highSchool': 'NorthwestHS', 'email': 'JFarough@***il.com', 'firstName': 'Jamie'}, {'availableDates': ['2018-02-01', '2018-02-02'], 'lastName': 'Saggot', 'highSchool': 'NorthwestHS', 'email': 'BSaggot@***il.com', 'firstName': 'Bob'}]} new_data = [(a, list(b)) for a, b in itertools.groupby(sorted(data['Invitees'], key=lambda x:int(x['availableDates'][-1].split('-')[-1])-int(x['availableDates'][0].split('-')[-1]), reverse=True), key=lambda x:int(x['availableDates'][-1].split('-')[-1])-int(x['availableDates'][0].split('-')[-1]))] final_students = {'Attendee':[{"aCount":len(b), "attendees":[c['email'] for c in b], "highschool":[c['highSchool'] for c in b][0], "startDate":[c['availableDates'][0] for c in b][0]} if a == 1 else {'aCount':0, 'attendees':[], 'highschool':[i['highSchool'] for i in b][0], 'startdate':None} for a, b in new_data]}

{'Attendee': [{'aCount': 3, 'startDate': '2018-02-01', 'highschool': 'NorthwestHS', 'attendees': ['WKlein@***il.com', 'JFarough@***il.com', 'BSaggot@***il.com']}, {'aCount': 0, 'startdate': None, 'highschool': 'SouthwestHS', 'attendees': []}]}

输出:

  "scripts": {
    "start": "node ./bin/www"
  },