簡體   English   中英

將元組列表分組到帶有python列表的元組列表

[英]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.

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