У меня есть класс Node, у которого есть поле с именем 'соседей', которое является списком. Я хочу обновить этот список, если найду вектор, более близкий к тем, которые в настоящее время находятся у соседей.
В этом фрагменте кода я печатаю слово и его соседей внутри и вне l oop:
def create_knn(self, k):
nodes = copy.deepcopy(self.nodes)
for i in range(len(nodes)):
for y in nodes:
if (nodes[i].word == y.word):
continue
self.nodes[i] = self.update_neighbours(nodes[i], y, k)
#print temp
print(self.nodes[i].word + "----------------------------------")
for j in self.nodes[i].neighbours:
print("neighbour: " + j.word)
print("\n")
#print temp
for i in self.nodes:
print("word: " + i.word)
for j in i.neighbours:
print("neighbour: " + j.word)
print("\n")
Но соседи отличаются от того, когда я печатаю внутри и снаружи l oop.
Я получаю этот вывод (для 10 векторов).
Внутри l oop:
go_VERB ----------- --- сосед: get_VERB
make_VERB ------------ сосед: get_VERB
get_VERB ------------- сосед: get_VERB
one_NUM -------------- сосед: знаю_ВЕРБ
see_VERB ------------- сосед: знаю_ВЕРБ
time_NOUN ------------ сосед: year_NOUN
take_VERB ------------ сосед: go_VERB
know_VERB- ----------- сосед: go_VERB
year_NOUN ------------ сосед: time_NOUN
За пределами l oop:
слово: say_VERB
сосед: time_NOUN
слово: go_VERB
сосед: time_NOUN
слово: make_VERB
сосед: time_NOUN
слово: get_VERB
сосед: time_NOUN
слово: one_NUM
сосед: time_NOUN
слово: see_VERB
сосед: time_NOUN
word: time_NOUN
neig hbour: time_NOUN
слово: take_VERB
сосед: time_NOUN
слово: know_VERB
сосед: time_NOUN
слово: year_NOUN
сосед: time_NOUN
Понятия не имею, что делать. Я новичок в python, так есть ли какое-то поведение списков, которых я не знаю?
Это мой код:
Класс Node:
word = ""
vector = []
neighbours = []
def __init__(self, word, vector):
self.word = word
self.vector = vector
def __eq__(self, other):
return self.word == other.word
класс КННГраф:
nodes = []
def create_knn(self, k):
nodes = copy.deepcopy(self.nodes)
for i in range(len(nodes)):
for y in nodes:
if (nodes[i].word == y.word):
continue
self.nodes[i] = self.update_neighbours(nodes[i], y, k)
#print temp
print(self.nodes[i].word + "----------------------------------")
for j in self.nodes[i].neighbours:
print("neighbour: " + j.word)
print("\n")
#print temp
for i in self.nodes:
print("word: " + i.word)
for j in i.neighbours:
print("neighbour: " + j.word)
print("\n")
def update_neighbours(self, x, y, k):
prod = self.calculate_inner_product(x, y)
min_prod = prod
min_n = copy.deepcopy(x)
for n in x.neighbours:
if (n.word == y.word):
return
n_prod = self.calculate_inner_product(x, n)
if (n_prod < min_prod):
min_prod = n_prod
min_n = n
if (len(x.neighbours) < k):
x.neighbours.append(y)
elif ((len(x.neighbours) >= k) and (min_prod < prod)):
x.neighbours.remove(min_n)
x.neighbours.append(y)
return x
def calculate_inner_product(self, x, y):
return np.inner(x.vector, y.vector)