[英]group list of tuples to list of tuples with lists in python
我有一個元組列表,每個元組都有患者和訪問,患者可以多次訪問
我想獲得患者名單以及每位患者的就診名單
例如
[(patient1, visit), (patient2, visit), (patient1, visit)]
到
[(patient1, [visit, visit]), (patient2, [visit])]
我嘗試了 javascript 的reduce
函數方法,但我真的不明白如何在 python 中做到這一點
defaultdict
方法是標准方法並且具有線性復雜度。 你也可以只使用一個通用的 dict 和dict.setdefault
d = {}
for patient, visit in data:
d.setdefault(patient, []).append(visit)
[*d.items()]
# [('patient1', ['visit', 'visit']), ('patient2', ['visit'])]
對於單行方法(不包括導入) - 盡管只是對數線性,您可以使用itertools.groupby
:
from itertools import groupby
from operator import itemgetter as ig
[(k, [*map(ig(1), g)]) for k, g in groupby(sorted(data), key=ig(0))]
# [('patient1', ['visit', 'visit']), ('patient2', ['visit'])]
一些有用的文檔:
您可以通過以下方式使用collections.defaultdict
:
from collections import defaultdict
d = defaultdict(list)
for patient, visit in data:
d[patient].append(visit)
使用 itertools.groupby 的示例
from itertools import groupby
# Example data
records = [('bill', '1/1/2021'), ('mary', '1/2/2021'), ('janet', '1/3/2021'), ('bill', '3/5/2021'), ('mary', '4/25/2021')]
# Group visits by patient names
g = groupby(sorted(records), lambda kv: kv[0]) # Group based upon first element of tuples (i.e. name)
# Sort so names are adjacent for groupby
# Using list comprehension on groupings to provided desired tuples
result = [(name, [d[1] for d in visit]) for name, visit in g]
以上代碼為單行代碼
result = [(name, [d[1] for d in visit]) for name, visit in groupby(sorted(records), lambda kv: kv[0])]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.