LINUX.ORG.RU

Python - создание list of dicts в цикле

 


1

2

Подскажите пожалуйста, возможно ли реализовать такую конструкцию?

Сейчас код выглядит так:

import unicodecsv as csv

file_path = 'main.csv'

def csv_reader(csv_file_name):
    with open(csv_file_name, 'rb') as csvfile:
        reader = csv.DictReader(csvfile)
        csv_list = []
        for row in reader:
            csv_list.append({'FirstName':row['FileName'], 'SecondName':row['SecondName']})
            print(row['FileName'], row['SecondName'])
    return csv_list
  
el_list = csv_reader(file_path)

Так хочется что бы выглядел код:

import unicodecsv as csv

file_path = 'main.csv'
output_fields = ['FileName', 'SecondName']

def csv_reader(csv_file_name, output_fields):
    with open(csv_file_name, 'rb') as csvfile:
        reader = csv.DictReader(csvfile)
        csv_list = []
        for row in reader:
            csv_list.append(dict(zip(output_fields[::1], row[output_fields[::1]])))
            print(row[e] for e in output_fields)
    return csv_list
  
el_list = csv_reader(file_path, output_fields)

т.е. основная задача при вставке в список элемента (каждый элемент это словарь) генерировать словарь исходя из списка ключей словаря, который передается параметром. Имена ключей словаря и мена полей - совпадают.

  for row in reader:
            csv_list.append({'FirstName':row['FileName'], 'SecondName':row['SecondName']})
            print(row['FileName'], row['SecondName'])

       for row in reader:
            csv_list.append(dict(zip(output_fields[::1], row[output_fields[::1]])))
            print(row[e] for e in output_fields)

Ответ на: комментарий от anonymous

Каким образом? В качестве ключа элементы входящего списка можно сделать через dict compr, ну а как value задасть = row['FileName']

drag7ter
() автор топика

Чем тебя не устраивает использовать параметр field_names для DictReader?

beresk_let ★★★★★
()

Если я тебя правильно понял, то как-то так:

csv_list = [{field: row[field] for field in output_fields} for row in reader]
Esper
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.