簡體   English   中英

如何按每個元組中的第一個元素對元組列表進行排序,並選擇每個組中最后一個元素最大的元組

[英]How to sort a list of tuples by the first element in each tuple, and pick the tuple with the largest last element in each group

這里我有一個 n 個 k 元組的列表(這里我設置 n = 4,k = 5)

A = [(1, 3, 5, 6, 6), (0, 1, 2, 4, 5), (1, 9, 8, 3, 5), (0, 2, 3, 5, 7)]

我希望按第一個元素對這些元組進行排序,因此將分為 2 組。 在每個組中,我只想 select 最后一個元素最大的 1 個元組。 所以在這種情況下,我希望我的 function 中的 output 是一個元組列表,比如

[(1, 3, 5, 6, 6),
 (0, 2, 3, 5, 7)]

以下是我的嘗試,但似乎效果不佳

import pandas as pd
import numpy as np

def f (sample):

    data = pd.DataFrame(sample)
    grouped_data = data.groupby(0)
    maximums = grouped_data.max(4)
    result = list(maximums.to_records(index = False))
    
    return result

我想知道這是否可以通過寫一個 dict 來完成? 如果是這樣,如何? 歡迎任何提示或幫助。

您可以為此使用itertools.groupby

import itertools


def by_first_element(t):
    return t[0]


def by_last_element(t):
    return t[-1]


sorted_A = sorted(A, key=by_first_element)
groups = [[*g] for _, g in itertools.groupby(sorted_A, key=by_first_element)]
max_of_each_group = [max(g, key=by_last_element) for g in groups]

Output:

[(0, 2, 3, 5, 7), (1, 3, 5, 6, 6)]

或者,是的,您可以使用字典:

groups = {}
for t in A:
    groups[t[0]] = groups.get(t[0], []) + [t]

max_of_each_group = [max(g, key=lambda t: t[-1]) for g in groups.values()]

如果你想要max_of_each_group排序,那么

>>> sorted(max_of_each_group, key=lambda t: t[0])
[(0, 2, 3, 5, 7), (1, 3, 5, 6, 6)]

用 dict 完成這件事是微不足道的。 事實上,由於您要對組進行縮減操作,因此您可以在每一步進行縮減時非常節省空間:

>>> A = [(1, 3, 5, 6, 6), (0, 1, 2, 4, 5), (1, 9, 8, 3, 5), (0, 2, 3, 5, 7)]
>>> result = {}
>>> for tup in A:
...     first = tup[0]
...     result[first] = max(tup, result.get(first, tup), key=lambda x:x[-1])
...
>>> result
{1: (1, 3, 5, 6, 6), 0: (0, 2, 3, 5, 7)}
>>> list(result.values())
[(1, 3, 5, 6, 6), (0, 2, 3, 5, 7)]

另一種有效的方法是先進行分組步驟,然后進行歸約步驟,這可能更具有普遍性:

>>> result = {}
>>> grouper = {}
>>> for tup in A:
...     grouper.setdefault(tup[0],[]).append(tup)
...
>>> grouper
{1: [(1, 3, 5, 6, 6), (1, 9, 8, 3, 5)], 0: [(0, 1, 2, 4, 5), (0, 2, 3, 5, 7)]}

並減少:

>>> {k: max(v, key=lambda x:x[-1]) for k,v in grouper.items()}
{1: (1, 3, 5, 6, 6), 0: (0, 2, 3, 5, 7)}

暫無
暫無

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

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