gpt4 book ai didi

python - 使用 map 应用多个功能

转载 作者:太空狗 更新时间:2023-10-29 21:30:58 24 4
gpt4 key购买 nike

我有 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 包含一个二维字符串数组(根据输入格式),我想对该对象的列执行操作。到目前为止,我无法控制任何事情。

我想对该结构做三件事:将行转置为列,从每个 Data 对象中提取 value,然后尝试将值转换为 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,它只是当前用例。

最佳答案

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

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]

关于python - 使用 map 应用多个功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858735/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com