我从 F# 和 Elixir 转向 Python,在干净地编码数据转换方面遇到了很大的困难。我曾经使用过的每种语言都有管道运算符和/或方法链接的概念,因此对于 Python,我很困惑如何找到一种easy的方法来完成此任务,并且不会偏离所谓的“Pythonic” “代码。
这是我可能拥有的一些处理功能的简单集合:
def convert_int_to_bool(integer: int) -> bool:
match integer:
case 0:
False
case 1:
True
case _:
ValueError(
f"Integer value must be either 0 or 1 to be converted to `bool`. Given: {integer}"
)
def convert_string_to_characters(string: str) -> list[str]:
return [character for character in string]
在Python中,我可以做类似的事情:
def test(response: str) -> <some type>:
[a, b, c, d] = map(convert_int_to_bool, map(int, convert_string_to_characters(response)))
...
但这并不理想,即使是在列表上映射两次的简单情况也是如此。好吧,然后我知道我可以做类似的事情:
[a, b, c, d] = [convert_int_to_bool(int(character)) for character in response]
那是okay,但它又不能很好地扩展到处理函数链,特别是如果里面有一个
filter
。所以我想做的是类似:
[a, b, c, d] = response.convert_string_to_characters().map(int).map(convert_int_to_bool)
或
[a, b, c, d] = response |> convert_string_to_characters() |> map(int) |> map(convert_int_to_bool)
对于第一个提出的方法链接方式,似乎我可以通过扩展 str
和
list
的内置类型来潜在地做到这一点,但是这存在一些问题,因为我读过有关与这些类型的内置文字结构。
是否有任何库或方法可以重载/覆盖内置类型或定义自定义运算符,让我能够以干净的方式执行此操作?谢谢你。
是否有任何库或方法可以重载/覆盖内置的 类型或定义自定义运算符,这将允许我在 干净的方式?
pandas
或更准确地说是pandas.Series.apply
。将 3 个函数应用于整数系列的简单示例。
import pandas as pd
def square(x):
return x ** 2
def evenify(x):
return 2 * (x // 2)
def add_one(x):
return x + 1
s = pd.Series([1,2,3,4,5,6,7,8,9])
s2 = s.apply(square).apply(evenify).apply(add_one)
print(s2)
提供输出
0 1
1 5
2 9
3 17
4 25
5 37
6 49
7 65
8 81
dtype: int64