我使用频率(%)和熵(位)。这两个现实非常相似,很容易混淆。
当我有频率/熵元组时,我总是命名元组成员,以便我的代码更容易理解。
我正在努力寻找该功能的解决方案
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
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)]