如何按每个元组中的第一个元素对元组列表进行排序,并选择每个组中最后一个元素最大的元组
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)]
我希望按照第一个元素对这些元组进行排序,所以会分成两组。在每个组中,我只想 select 1 个元组,其最后一个元素是最大的。所以在这种情况下,我希望我的函数输出是一个元组列表,比如
[(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
我想知道是否可以通过写字典来实现?如果是这样,如何?
欢迎任何提示或帮助。
您可以为此使用 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]
输出:
[(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 完成这件事是微不足道的。事实上,由于您要对组进行缩减操作,因此您可以相当space-高效地在每一步进行缩减:
>>> 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)}
这里我有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)]
我希望按照第一个元素对这些元组进行排序,所以会分成两组。在每个组中,我只想 select 1 个元组,其最后一个元素是最大的。所以在这种情况下,我希望我的函数输出是一个元组列表,比如
[(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
我想知道是否可以通过写字典来实现?如果是这样,如何? 欢迎任何提示或帮助。
您可以为此使用 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]
输出:
[(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 完成这件事是微不足道的。事实上,由于您要对组进行缩减操作,因此您可以相当space-高效地在每一步进行缩减:
>>> 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)}