簡體   English   中英

在字典中查找具有相同值的嵌套列表[Python]

[英]Finding nested list with identical values in Dictionaries [Python]

目前有這樣構成的字典

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個日期。

還嘗試了下面的函數來過濾列表中不同值之間的相同日期,但不知道如何對兩個以上的列表進行過濾:

 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
    }

西南高中無法參加,因為該學校的參加者沒有連續2天的可用時間,因此返回NULL。 任何有關如何構造程序或使用哪種方法的建議,將不勝感激!!

您可以使用itertools.groupby

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': []}]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM