首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Python中初始化字典,其中key是一个对象?

如何在Python中初始化字典,其中key是一个对象?
EN

Stack Overflow用户
提问于 2018-06-01 10:40:01
回答 3查看 85关注 0票数 1

我正在尝试重新表述发现here的实现。这就是我到目前为止所知道的:

代码语言:javascript
复制
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])

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

代码语言:javascript
复制
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

将具有类似以下内容的输出

代码语言:javascript
复制
{<__main__.IrisFlower object at 0x107774fd0>: 0.25999999999999945}

这是可以的。但我不想先创建字典,然后再追加键值,如下所示:

代码语言:javascript
复制
d = dict()
d[training_flower] = dist

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

代码语言:javascript
复制
d = dict(training_flower = dist)

但是,看起来dist方法使用的不是实例,而是字符串,因为我看到的打印内容如下所示:

代码语言:javascript
复制
{'training_flower': 23.409999999999997}
{'training_flower': 16.689999999999998}

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-01 10:44:09

要使用非有效关键字的键直接创建字典,请使用{}语法,如下所示:

代码:

代码语言:javascript
复制
d = {training_flower: 'a_value'}

测试代码:

代码语言:javascript
复制
training_flower = 'a key'
d = {training_flower: 'a_value'}
print(d)

结果:

代码语言:javascript
复制
{'a key': 'a_value'}
票数 2
EN

Stack Overflow用户

发布于 2018-06-01 10:56:25

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

代码语言:javascript
复制
d = {training_flower: dist}
票数 3
EN

Stack Overflow用户

发布于 2018-06-01 10:53:26

使用对象作为键初始化字典(edit:,Stephen示例中的字符串无论如何都是一个对象)

代码语言:javascript
复制
class Flower:

    def __repr__(self):
        return 'i am flower'


flower1 = Flower()
d = {flower1: 4}
print(d)

输出

代码语言:javascript
复制
{i am flower: 4}

这是我在这里的第一篇文章,我知道我来晚了,如果这是一个重复的解决方案,很抱歉。只是为了展示它对一个对象的工作。

我会支持斯蒂芬的答案,但我现在还不能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50635368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档