Как я могу инициализировать словарь в Python, где ключ является объектом? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь перефразировать найденную реализацию здесь .Это то, что у меня есть:

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])

В настоящее время операторы print в следующем блоке кода:

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 метод использует экземпляр, а скорее String, потому что то, что я вижу напечатанным, выглядит следующим образом:

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

Как создать словарь, используя объект в качестве ключа водно утверждение?

Ответы [ 3 ]

0 голосов
/ 01 июня 2018

для инициализации словаря с объектом в качестве ключа, (правка: в любом случае строка в примере Стивена является объектом)

class Flower:

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


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

выводит

{i am flower: 4}

это мойПервый пост здесь, и я знаю, что я опоздал, извините, если это дублирующее решение.просто чтобы показать, что он работает с объектом.

подтвердит ответ Стивена, но я пока не могу.

0 голосов
/ 01 июня 2018

В вашем фрагменте, где вы пишете d = dict(training_flower=dist), "training_flower" является ключевым аргументом для функции dict, а не объекта.Это эквивалентно написанию d = {'training_flower': dist}.Единственный способ создать словарь с объектом в качестве ключа - использовать последний синтаксис:

d = {training_flower: dist}
0 голосов
/ 01 июня 2018

Чтобы напрямую создать dict с ключом, который не является допустимым ключевым словом, используйте синтаксис {}, например:

Код:

d = {training_flower: 'a_value'}

Код теста:

training_flower = 'a key'
d = {training_flower: 'a_value'}
print(d)

Результаты:

{'a key': 'a_value'}
...