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

Есть ли более питонический способ распределить содержимое нескольких списков по полям в нескольких структурах? Пример ниже с использованием 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]
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)
]

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