在集合列表中为集合索引 1 处的元素查找最大值

find max value in a list of sets for an element at index 1 of sets

我有一个这样的列表:

dummy_list = [(8, 'N'),
 (4, 'Y'),
 (1, 'N'),
 (1, 'Y'),
 (3, 'N'),
 (4, 'Y'),
 (3, 'N'),
 (2, 'Y'),
 (1, 'N'),
 (2, 'Y'),
 (1, 'N')]

并希望在第 2 列中的值为 'Y'.

的集合中的第 1 列中获取最大值

如何尽可能高效地执行此操作?

您可以将 max 函数与生成器表达式一起使用。

>>> dummy_list = [(8, 'N'),
...  (4, 'Y'),
...  (1, 'N'),
...  (1, 'Y'),
...  (3, 'N'),
...  (4, 'Y'),
...  (3, 'N'),
...  (2, 'Y'),
...  (1, 'N'),
...  (2, 'Y'),
...  (1, 'N')]
>>>
>>> max(first for first, second in dummy_list if second == 'Y')
4
max([i[0] for i in dummy_list if i[1] == 'Y'])

您可以为此使用 pandas,因为您拥有的数据类似于 table。

import pandas as pd

df = pd.DataFrame(dummy_list, columns = ["Col 1", "Col 2"]) 
val_y = df[df["Col 2"] == "Y"]
max_index = val_y["Col 1"].idxmax()

print(df.loc[max_index, :])

首先,使用 pd.DataFrame 将其转换为 pandas 数据框,并将列名设置为 Col 1 and Col 2

然后你得到数据框内的所有行 Col 2 值等于 Y.

获得此数据后,只需 select Col 1 并对其应用 idxmax 函数即可获得该系列最大值的索引。

然后您可以在 loc 函数中将此索引作为行传递,将 : (every) 作为列传递以获取整行。

这样可以压缩成两行,

max_index = df[df["Col 2"] == "Y"]["Col 1"].idxmax()
df.loc[max_index, :]

输出-

Col 1    4
Col 2    Y
Name: 1, dtype: object

max([i for i in dummy_list if i[1] == 'Y'])

output: (4, 'Y')


max(filter(lambda x: x[1] == 'Y', dummy_list))

output: (4, 'Y')

通过将回调函数传递给 max 以获得更精细的搜索,不需要进一步 迭代。

y_max = max(dummy_list, key=lambda p: (p[0], 'Y'))[0]
print(ymax)

通过解耦这些对并将它们分类为 YN

d = {}
for k, v in dummy_list:
    d.setdefault(v, []).append(k)

y_max = max(d['Y'])

通过 zip-解耦,可以使用 mask-like 方法使用 itertools.compress

values, flags = zip(*dummy_list)
y_max = max(it.compress(values, map('Y'.__eq__, flags)))
print(y_max)