Изменение параметров элементов в списке по отдельности

Я хочу изменить параметры в списке элементов QF и QD следующим образом: Решетка представляет собой список, включающий, например, следующие элементы:

lattice = [QF, QD, QF, QD]

А индексы этих элементов в списке задаются в quad_indexes.

QF и QD имеют два параметра (K и FamName):

QF.K = 1.7 and QD.K = -2.1
QF.FamName = 'QF'
QD.FamName = 'QD'

Я хочу дать случайное значение параметра K для каждого элемента в отдельности

Я попытался:

    i =0
    Quad_strength_err =[]
    while(i < len(quad_indexes)):

         if (lattice[quad_indexes[i]].FamName == 'QF'):
              lattice[quad_indexes[i]].K *= (1 + errorQF*random())
              i += 1

         elif (lattice[quad_indexes[i]].FamName == 'QD'):
             lattice[quad_indexes[i]].K *= (1 + errorQD * random())
             i += 1
    
    for j in quad_indexes:
       quad_strength_err = lattice[j].K
       Quad_strength_err.append(quad_strength_err)

Проблема в том, что когда я печатаю (Quad_strength_err), я получаю фиксированное значение для каждого из QF и QD, например:

[1.8729820159805597, -2.27910323371567, 1.8729820159805597, -2.27910323371567]

Я ищу результат, например:

[1,7729820159805597, -2,17910323371567, 1,8729820159805597, -2,27910323371567]

Непонятно, какой результат вы на самом деле хотели.

Scott Hunter 17.03.2022 13:41

@ScottHunter Я ищу результат, например: [1.7729820159805597, -2.17910323371567, 1.8729820159805597, -2.27910323371567]

ely66 17.03.2022 13:57

@ely66 ely66, до сих пор не понял твоей цели. Можете ли вы привести минимальный воспроизводимый пример? Мы не можем запустить ваш код, так как некоторые данные отсутствуют, и вы не указали, какую случайную функцию вы используете.

Zelemist 17.03.2022 14:01

Вы проверили, что ваш сгенерированный случайный поплавок отличается

gftea 17.03.2022 14:01

В вашей структуре данных много косвенности. Может быть, lattice[0] — это псевдоним lattice[3]? На самом деле проблема почти наверняка в этом: строка lattice = [QF, QD, QF, QD] создает указатели на QF и QD, а не копии.

joanis 17.03.2022 14:10

@joains, Да, решетка [0].FamName = 'QF', а также решетка [0].FamName = 'QF' Но я хочу рассматривать каждую из них по отдельности, как я могу это решить?

ely66 17.03.2022 14:15

@ely66 ely66 Смотрите мой ответ для решения.

joanis 17.03.2022 14:18
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
7
39
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

TL;DR

Вам нужно сделать копии QF и QD - вы делаете псевдонимы.

Эта проблема

Проблема почти наверняка связана с алиасингом.

Когда вы инициализируете lattice этой строкой:

lattice = [QF, QD, QF, QD]

что вы делаете, так это создаете структуру с двумя указателями на QF и двумя указателями на QD.

Затем в своем цикле вы дважды изменяете QF, один раз через lattice[0] и снова через lattice[2], и то же самое для QD.

Решение

Что вам нужно сделать, так это создать копии, может быть поверхностные, а может быть, глубокие.

Попробуйте этот вариант:

from copy import copy
lattice = [copy(QF), copy(QD), copy(QF), copy(QD)]

и если это все еще не работает, вам может понадобиться глубокая копия:

from copy import deepcopy
lattice = [deepcopy(QF), deepcopy(QD), deepcopy(QF), deepcopy(QD)]

Или более компактная версия того же кода, просто потому что мне нравятся понимания:

from copy import deepcopy
lattice = [deepcopy(x) for x in (QF, QD, QF, QD)]

Решение отлично работает с deepcopy

ely66 17.03.2022 14:47

Если ваш код правильный, вы не можете ожидать другого результата для вашего первого и третьего элемента lattice (соответственно второго и последнего), поскольку это (для упрощения) один и тот же элемент.

Используя id, вы можете легко показать, что lattice[0] и lattice[2] имеют один и тот же идентификатор, поэтому изменение lattice[0] изменит lattice[2].

Вы можете дублировать каждый объект QF и QD, чтобы избавиться от этого поведения.

Я попытался создать рабочий пример вашей проблемы, начав с создания простых классов QF и QD:

from random import random

class QF():
    def __init__(self):
        self.K =  1.7
        self.FamName = "QF"
        
class QD():
    def __init__(self):
        self.K =  -2.1
        self.FamName = "QD"    

затем я создаю решетку с другим экземпляром класса, вызывая их с помощью ()

lattice = [QF(), QD(), QF(), QD()]

Я думаю, что ваша ошибка связана с этим шагом, поскольку QF относится к самому классу и QF создает совершенно новый экземпляр, который вы можете изменить отдельно от другого. Например, если вы делаете QF.K = 3, а затем a = QF(), a.K должно вернуть вам 3.

наконец, я применяю некоторую случайность, используя ранее импортированный random:

for i in lattice:
    if i.FamName == "QF":
        i.K = (1 + errorQF*random())
    elif i.FamName == "QD":
        i.K = (1 + errorQD*random())


форма, которую я получаю:

print(*[i.K for i in lattice])

>>>> 1.148989048860669 0.9324164812782919 1.0652187255939742 0.6860911849022292

Другие вопросы по теме