Переменная итерации внутри словаря генератора

#python #dictionary #iterator

#python #словарь #итератор

Вопрос:

Добрый день! Возникает вопрос об итерации внутри словарей генератора в python:

 sort_dict = {select_keys: {rows: {j: item for item in self.csv_dict.values() if item.get(select_keys) == rows} for rows in keys}}
  

Необходимо, чтобы переменная j увеличивалась до тех пор, пока в нее не будут записаны данные вырожения:

 for item in self.csv_dict.values () if item.get (select_keys) == rows}
  

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

Существует класс, который обрабатывает файл прошивки csv:

`импортировать csv

класс CSV():

 def __init__(self, file_path):
    super().__init__()
    self.file_path = file_path
    self.csv_dict = {}

"""Данный метод парсит переданный в класс CSV файл"""
def parseeCSV(self):
    print('n')
    self.getDictCSV()
    print(self.getListKeysCSV())
    unic_key = self.getUnicValFromCustomKeys('zip')
    sort_csv = self.getCsvSortForKeys(unic_key, 'zip')

"""Данный метод создает словарь из переданного в класс CSV файла
Словарь вида {Номер строки(записи){строка(запись)}}
"""
def getDictCSV(self):
    i = 0
    with open(self.file_path, 'r') as csv_desctiptor:
        csv_obj = csv.DictReader(csv_desctiptor)
        for csv_dict in csv_obj:
            self.csv_dict[i] = csv_dict
            i = i   1
    del csv_desctiptor
    return True

"""Данный метод возвращает все ключи из словаря self.csv_dict[0]"""
def getListKeysCSV(self):
    return dict.keys(self.csv_dict[0])

"""Данный метод возвращает уникальные значения по выбранным полям"""
def getUnicValFromCustomKeys(self, keys):
    i = 0
    val_key = {}
    while i < len(self.csv_dict):
        val_key[i] = self.csv_dict[i].get(keys)
        unic_val_key = set(val_key.values())
        i = i   1
    return unic_val_key

def getCsvSortForKeys(self, keys, select_keys):
    #sort_dict = {select_keys: {rows: '' for rows in keys}}
    i = 0`
  

Он анализирует файл типа CSV:

street,city,zip,state,beds,baths,sq__ft,type,sale_date,price,latitude,longitude
3526 HIGH ST,SACRAMENTO,95838,CA,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.631913,-121.434879

В то же время он должен делать тип словаря:

csv_dict[key_select][key_select_val][num-element][element_csv_string]

Например: csv_dict['zip']['95838'][1][3526 HIGH ST,SACRAMENTO,95838,CA,2,1,836,Residential,Wed May 21 00:00:00 EDT 2008,59222,38.631913,-121.434879

Заранее спасибо и приношу извинения за глупые вопросы.

Комментарии:

1. что такое j ? как j предполагается увеличивать, как 0..n , или есть ли какое-либо конкретное увеличение.

2. Я не совсем понимаю ваш вопрос, но вы, вероятно, можете использовать enumerate для получения j значений.

3. @SSj.Luffy J — это обычная переменная типа integer. На каждой итерации она должна увеличиваться на 1 и, как только все элементы словаря rows будут выполнены, принимать значение 0 и начинать все сначала

4. @PM2Ring Мне просто нужно увеличить J , как я сказал ранее. Проблема в том, что я заранее не знаю, на сколько следует увеличить J. Ее конечное значение может быть 5 или 10 в зависимости от количества элементов, удовлетворяющих item

Ответ №1:

Пожалуйста, объясните свой вопрос.

Я не могу собрать ни одной ссылки на j в вашем коде. А также код кажется неправильно сконструированным.

 sort_dict = {select_keys: {rows: 
    {j: item for j,item in enumerate(self.csv_dict.values()) 
        if item.get(select_keys) == rows} for rows in keys}}
  

Надеюсь, это поможет!

Комментарии:

1. Существует класс, который обрабатывает файл прошивки csv:

2. sort_dict = {select_keys: {строки: {j: элемент для j,элемент в enumerate( self.csv_dict.values()) если item.get(select_keys) == строки} для строк в ключах}}

3. Извините, я впервые был в stackoverflow. Я ответил на ваш вопрос, расширив тему

4. Спасибо — вроде проблема с J решена, но массив дублируется: sort_dict = {select_keys: {rows: {j: item for j,item in enumerate(self.csv_dict.values()) if item.get(select_keys) == rows} for rows in keys}} for roww in keys: print(sort_dict[select_keys].keys()) Результат: dict_keys(['95663', '95747', '95835'....]) dict_keys(['95663', '95747', '95835'...])

5. Я прошу прощения. Проблема решена. Большое вам спасибо. проблема дублирования вызвана моей невнимательностью. Еще раз спасибо!