Странное поведение при назначении значения списка ключу в словаре в Python - PullRequest
0 голосов
/ 07 ноября 2019

У меня проблемы с пониманием того, что я сделал неправильно в своем простом коде. Я нашел "решение", но я хотел бы понять, "почему" :)В общем, я делаю простую группу, используя словарь и списки. Когда я присваиваю ключу значение, представляющее собой список из 2 элементов, первый элемент (значение) в этом словаре разделяется на два отдельных значения, все остальные значения ведут себя правильно - это список из 2 элементов.

ИтакУ меня было 4 значения, когда был напечатан словарь.

1301
425
['979', '340']
['1301', '977']

Но я смог исправить это, чтобы получить 3 пары значений - желаемый результат:

['1301', '425']
['979', '340']
['1301', '977']

Как я уже сказал, я былЯ смог решить эту проблему, используя метод .setdefault(), чтобы назначить первый элемент простого набора, но я не понимаю, почему это имеет значение. Вот мой код, все другие аспекты класса работают должным образом или будут работать должным образом в «будущем» :): D

import os
import copy

from pathlib import Path

class ManageSettings:    
    def __init__(self, record_or_not = False,config_path = ".\\settings\\"):
        self.to_record       = record_or_not
        self.ini_path        = config_path + "\\position_settings.ini" # file path for settings
        path_to_save = Path(config_path)
        path_to_save.mkdir(exist_ok=True)
        self.__position_list = {}
    def save_or_load (self, sequence = 0):
            if(self.to_record):            
                pass                            
            else:
                self.load_settings()

    def save_settings(self, sequence = 0):
        with open(self.ini_path, 'w') as file_writter:
            for posXY in self.position_list:
                file_writter.write("{};{};{}\n".format(sequence, posXY[0], posXY[1]))

    def load_settings(self):
        with open(self.ini_path, 'r') as file_reader:
            sequence_dict = {}            
            for line_XY in file_reader:
                sequence, posX, posY = line_XY.strip().split(";")
                XYposList = list((posX, posY))
                print(XYposList)
                if not sequence in sequence_dict:

Вот часть, которая при изменении напечатает другой результат

                    # sequence_dict.setdefault(sequence,[]).append( XYposList)
                    sequence_dict[sequence] = XYposList
            else:        
                sequence_dict[sequence].append( XYposList)            # self.position_list = sequence_dict
        print ('in  class')
        for values in sequence_dict.values():
            print (values)
        self.position_list = sequence_dict
@property
def position_list(self):
    return self.__position_list
@position_list.setter
def position_list(self, position_list):
    self.__position_list = position_list

Это, как вы можете просто проверить класс, конечно, если у вас есть INI-файл:)

testClas = ManageSettings(False)
testClas.save_or_load()
print("outside the class")
for  value in testKlas.position_list.values():
    # print (len(value))
    for test in value:
        print (test)  

Редактировать: Привет, вот содержание INIфайл

0;1301;425
0;979;340
0;1301;977

1 Ответ

0 голосов
/ 08 ноября 2019

Эта строка:

sequence_dict[sequence] = XYposList

должна быть:

sequence_dict[sequence] = [XYposList]

Значения в sequence_dict должны быть двухмерными списками. Но когда вы создаете первое значение, вы не помещаете его в список, вы просто используете XYPostList в качестве списка. Затем последующие вызовы append() добавляются в этот список. Итак, вы начинаете с

['1301', '425']

, а следующая строка добавляет ['979', '340'] к этому, в результате получается

['1301', '425', ['979', '340']]

Но вы хотите, чтобы начальное значение было:

[['1301', '425']]

и тогда оно становится

[['1301', '425'], ['979', '340']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...