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

Есть ли более питонический способ распределить содержимое нескольких списков по полям в нескольких структурах? Пример ниже с использованием pandas.dataframe

import pandas

# INPUT
files = ['file1.csv','file2.csv','file3.csv','file4.csv', 'file5.csv']
names = ['Cold', 'Hot','Hotter','Hottest','Hottestest']
lines = ['-','-',':','-',':']
colors = ['b','r','r','y','y']
marker = ['','','','o','']

cases = []
for idx,case in enumerate(files):
  cases.append(pandas.read_csv(fname))
  cases[idx].name   = names[idx]
  cases[idx].color  = colors[idx]
  cases[idx].marker = marker[idx]
  cases[idx].lines  = lines[idx]
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
39
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Обновлено: Используя Адриан ответ, мы можем упростить это, используя assign и **kwargs:

import pandas

# INPUT
file_map = {
    'file1.csv': {
        'name': 'Cold',
        'lines': '-',
        'colors': 'b',
        'marker': ''
    },
    # ...etc...
}

cases = []
for filename, attrs in file_map.iteritems():
    cases.append(pandas.read_csv(filename).assign(**attrs))

СТАРЫЙ ОТВЕТ:

Похоже, что диктовка изречений была бы лучше.

import pandas

# INPUT
file_map = {
    'file1.csv': {
        'name': 'Cold',
        'lines': '-',
        'colors': 'b',
        'marker': ''
    },
    # ...etc...
}

cases = []
for filename, attrs in file_map.iteritems():
  case = pandas.read_csv(filename)
  for attr, value in attrs.iteritems():
      setattr(case, attr, value)
  cases.append(case)

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

Это близко к тому, на что я надеялся, что-то похожее на Matlab deal (): mathworks.com/company/newsletters/articles/…

hahnpv 13.09.2018 22:22

@hahnpv Да, вы можете, я понял благодаря ответу Адриана. Смотрите мою правку.

mVChr 13.09.2018 23:17

Для справки в будущем .assign (** attrs) создает столбцы в DataFrame, а не атрибуты. Старый ответ работал нормально.

hahnpv 18.09.2018 15:36

Мне кажется, что ваш код достаточно хорош. Но если вы хотите избежать этих назначений внизу, попробуйте следующее:

import pandas

# INPUT
files = ['file1.csv','file2.csv','file3.csv','file4.csv', 'file5.csv']
names = ['Cold', 'Hot','Hotter','Hottest','Hottestest']
lines = ['-','-',':','-',':']
colors = ['b','r','r','y','y']
marker = ['','','','o','']

cases = [
    pandas.read_csv(fname)
          .assign(name=names[idx],
                  color=colors[idx],
                  marker=marker[idx],
                  lines=lines[idx])
    for idx,case in enumerate(files)
]

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