Skip to main content
 首页 » 编程设计

python之如何在键为对象的 Python 中初始化字典

2025年05月04日13itcoder

我正在尝试重新表述发现的实现 here .这是我目前所拥有的:

import csv 
import math 
import random 
 
training_set_ratio = 0.67 
 
training_set = [] 
test_set = [] 
 
 
class IrisFlower: 
    def __init__(self, petal_length, petal_width, sepal_length, sepal_width, flower_type): 
        self.petal_length = petal_length 
        self.petal_width = petal_width 
        self.sepal_length = sepal_length 
        self.sepal_width = sepal_width 
        self.flower_type = flower_type 
 
    def __hash__(self) -> int: 
        return hash((self.petal_length, self.petal_width, self.sepal_length, self.sepal_width)) 
 
    def __eq__(self, other): 
        return (self.petal_length, self.petal_width, self.sepal_length, self.sepal_width) \ 
               == (other.petal_length, other.petal_width, other.sepal_length, other.sepal_width) 
 
 
def load_data(): 
    with open('dataset.csv') as csvfile: 
        rows = csv.reader(csvfile, delimiter=',') 
        for row in rows: 
            iris_flower = IrisFlower(float(row[0]), float(row[1]), float(row[2]), float(row[3]), row[4]) 
            if random.random() < training_set_ratio: 
                training_set.append(iris_flower) 
            else: 
                test_set.append(iris_flower) 
 
 
def euclidean_distance(flower_one: IrisFlower, flower_two: IrisFlower): 
    distance = 0.0 
    distance = distance + math.pow(flower_one.petal_length - flower_two.petal_length, 2) 
    distance = distance + math.pow(flower_one.petal_width - flower_two.petal_width, 2) 
    distance = distance + math.pow(flower_one.sepal_length - flower_two.sepal_length, 2) 
    distance = distance + math.pow(flower_one.sepal_width - flower_two.sepal_width, 2) 
    return distance 
 
 
def get_neighbors(test_flower: IrisFlower): 
    distances = [] 
    for training_flower in training_set: 
        dist = euclidean_distance(test_flower, training_flower) 
        d = dict() 
        d[training_flower] = dist 
        print(d) 
    return 
 
 
load_data() 
get_neighbors(test_set[0]) 

目前,在以下代码块中打印语句:

def get_neighbors(test_flower: IrisFlower): 
    distances = [] 
    for training_flower in training_set: 
        dist = euclidean_distance(test_flower, training_flower) 
        d = dict() 
        d[training_flower] = dist 
        print(d) 
    return 

将有类似的输出

{<__main__.IrisFlower object at 0x107774fd0>: 0.25999999999999945} 

没关系。但我不想先创建字典,然后附加键值,如:

d = dict() 
d[training_flower] = dist 

所以这就是我正在尝试的:

d = dict(training_flower = dist) 

但是,dist 方法似乎不是在使用实例,而是一个字符串,因为我看到的打印内容如下:

{'training_flower': 23.409999999999997} 
{'training_flower': 16.689999999999998} 

如何在一个语句中使用对象作为键来创建字典?

请您参考如下方法:

在您编写 d = dict(training_flower=dist) 的代码段中,“training_flower”是 dict 函数的关键字参数,而不是对象。相当于写d = {'training_flower': dist}。创建以对象为键的字典的唯一方法是使用后一种语法:

d = {training_flower: dist}