我有我想要应用多个功能的 2D 数据。实际代码使用 xlrd
和 .xlsx
文件,但我将提供以下样板文件以便于重现输出。
class Data:
def __init__(self, value):
self.value = value
class Sheet:
def __init__(self, data):
self.data = [[Data(value) for value in row.split(',')] for row in data.split('\n')]
self.ncols = max(len(row) for row in self.data)
def col(self, index):
return [row[index] for row in self.data]
创建工作表:
fake_data = '''a, b, c,
1, 2, 3, 4
e, f, g,
5, 6, i,
, 6, ,
, , , '''
sheet = Sheet(fake_data)
在此对象中, data
包含一个二维字符串数组(根据输入格式),我想对该对象的列执行操作。到目前为止,我无法控制任何事情。
我想对这个结构做三件事:将行转置为列,从每个对象中提取 value
Data
对象,然后尝试将值转换为 float
.如果该值不是 float
,则应将其转换为 str
并去除空白。
from operators import attrgetter
# helper function
def parse_value(value):
try:
return float(value)
except ValueError:
return str(value).strip()
# transpose
raw_cols = map(sheet.col, range(sheet.ncols))
# extract values
value_cols = (map(attrgetter('value'), col) for col in raw_cols)
# convert values
typed_cols = (map(parse_value, col) for col in value_cols)
# ['a', 1.0, 'e', 5.0, '', '']
# ['b', 2.0, 'f', 6.0, 6.0, '']
# ['c', 3.0, 'g', 'i', '', '']
# ['', 4.0, '', '', '', '']
可以看出 map
对每一列应用了两次。在其他情况下,我想对每个列应用一个函数两次以上。
有没有更好的方法将多个函数映射到可迭代的条目?此外,是否有办法避免生成器理解并直接将映射应用于每个内部可迭代对象?或者,是否有更好且可扩展的方法来一起处理这一切?
请注意,此问题并非特定于 xlrd
,它只是当前的用例。
原文由 Jared Goguen 发布,翻译遵循 CC BY-SA 4.0 许可协议
看起来最简单的解决方案是滚动您自己的函数,将多个函数应用于同一个可迭代对象。
这里的缺点是用法与
map(function, iterable)
相反,扩展map
以接受参数会很尴尬(就像在 Python 3.X 中一样)。用法: