如何在 Python 中初始化字典,其中键是一个对象?
How can I initialize dictionary in Python where key is an object?
我正在尝试重新表述发现的实现 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 = {training_flower: 'a_value'}
测试代码:
training_flower = 'a key'
d = {training_flower: 'a_value'}
print(d)
结果:
{'a key': 'a_value'}
以对象为键初始化字典,(编辑:Stephen 示例中的字符串无论如何都是一个对象)
class Flower:
def __repr__(self):
return 'i am flower'
flower1 = Flower()
d = {flower1: 4}
print(d)
产出
{i am flower: 4}
这是我第一次 post 来这里,我知道我来晚了,抱歉,如果这是一个重复的解决方案。只是为了展示它适用于一个对象。
会赞成斯蒂芬的回答,但我现在还不能。
在您编写 d = dict(training_flower=dist)
的代码段中,"training_flower" 是 dict 函数的关键字参数,而不是对象。相当于写d = {'training_flower': dist}
。创建以对象为键的字典的唯一方法是使用后一种语法:
d = {training_flower: dist}
我正在尝试重新表述发现的实现 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 = {training_flower: 'a_value'}
测试代码:
training_flower = 'a key'
d = {training_flower: 'a_value'}
print(d)
结果:
{'a key': 'a_value'}
以对象为键初始化字典,(编辑:Stephen 示例中的字符串无论如何都是一个对象)
class Flower:
def __repr__(self):
return 'i am flower'
flower1 = Flower()
d = {flower1: 4}
print(d)
产出
{i am flower: 4}
这是我第一次 post 来这里,我知道我来晚了,抱歉,如果这是一个重复的解决方案。只是为了展示它适用于一个对象。
会赞成斯蒂芬的回答,但我现在还不能。
在您编写 d = dict(training_flower=dist)
的代码段中,"training_flower" 是 dict 函数的关键字参数,而不是对象。相当于写d = {'training_flower': dist}
。创建以对象为键的字典的唯一方法是使用后一种语法:
d = {training_flower: dist}