在键上使用 lambda 函数排序时解构元组

问题描述 投票:0回答:1

我使用频率(%)和熵(位)。这两个现实非常相似,很容易混淆。

当我有频率/熵元组时,我总是命名元组成员,以便我的代码更容易理解。

我正在努力寻找该功能的解决方案

sorted()
。只需检查以下代码:

import math

def entropy(probability: float) -> float:
    if probability == 0: return 0
    else: return -probability*math.log(probability)/math.log(2)

pairs = [(frequency/10, entropy(frequency/10)+entropy(1-frequency/10)) for frequency in range(11)]
print(pairs)
print(sorted(pairs, key=lambda f, e: -e * 1000 + f))

我真的很想能够用两个参数 lambda

f
编写
e
函数,但是我的 Python 一直说那里有语法错误:“排序”的重载与提供的参数不匹配.
有没有办法在Python中做到这一点,或者我应该像这样使用

@dataclass

@dataclass
class Pair:
    frequency: float = 0.0
    uncertainty: float = 0.0


python sorting lambda
1个回答
0
投票
pairs

中的每个元素都是一个元组,元组中的一个元素被视为f,另一个元素被视为e。 lambda 不是这样工作的。

import math

def entropy(probability: float) -> float:
    if probability == 0: return 0
    else: return -probability*math.log(probability)/math.log(2)

pairs = [(frequency/10, entropy(frequency/10)+entropy(1-frequency/10)) for frequency in range(11)]

# Use x[0] instead of f and x[1] instead of e and create a list
res = [(-x[1] * 1000 + x[0]) for x in pairs ]

#Create a dct mapping res and pairs
dct = dict(list(zip(res, pairs)))

#Sort res
res = sorted(res)

#Get values of the dct as a list being keys in the sorting order of res 
result = [v for x in res for k,v in dct.items() if x == k]

print(result)


#Output:
[(0.5, 1.0), (0.4, 0.9709505944546688), (0.6, 0.9709505944546688), (0.3, 0.8812908992306927), (0.7, 0.8812908992306927), (0.2, 0.7219280948873623), (0.8, 0.7219280948873623), (0.1, 0.4689955935892812), (0.9, 0.46899559358928117), (0.0, 0.0), (1.0, 0.0)] 

© www.soinside.com 2019 - 2024. All rights reserved.