使用地图应用多个功能

新手上路,请多包涵

我有我想要应用多个功能的 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 许可协议

阅读 324
2 个回答

看起来最简单的解决方案是滚动您自己的函数,将多个函数应用于同一个可迭代对象。

 def map_many(iterable, function, *other):
    if other:
        return map_many(map(function, iterable), *other)
    return map(function, iterable)

这里的缺点是用法与 map(function, iterable) 相反,扩展 map 以接受参数会很尴尬(就像在 Python 3.X 中一样)。

用法:

 map_many([0, 1, 2, 3, 4], str, lambda s: s + '0', int)
# [0, 10, 20, 30, 40]

原文由 Jared Goguen 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 lambda 轻松组合最后两个 map 调用,

 typed_cols = (map(lambda element:parse_value(element['value']), col)
              for col in value_cols)

虽然您可以在 Sheet.col 中进行类似的解析和提取,但 IMO 会影响代码的可读性。

原文由 Anurag Peshne 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏