首页 > 解决方案 > pythonic将列表转换为类字段的方法

问题描述

有没有更 Pythonic 的方式来将多个列表的内容分配到多个结构中的字段中?下面的示例使用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]

标签: pythonpython-2.7

解决方案


编辑:使用阿德里安的答案assign,我们可以使用and来简化这个**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如果您想对其更加严格,您还可以创建子图类或实例。


推荐阅读