在集合列表中为集合索引 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)
通过解耦这些对并将它们分类为 Y
、N
值
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)
我有一个这样的列表:
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'
.
如何尽可能高效地执行此操作?
您可以将 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)
通过解耦这些对并将它们分类为 Y
、N
值
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)