python - 阻止 Python enumerate() 将字符串拆分为字符
问题描述
我有一个函数,它采用关键字参数列表并根据关键字列表计算一堆结果,并且我正在使用 enumerate 来构造循环,以便输出包含所有结果的数据表。当参数列表大于一个但只传递一个参数时,一切都很好,枚举认为它想将该关键字拆分为单个字母。解决这个问题的明显方法是只删除 enumerate 调用并使用计数器变量,但是有没有办法使用 enumerate 函数来禁止这种行为?
下面是一个示例代码:
import numpy as np
import pandas as pd
x=np.array([1,2,3,4,5])
params = ("x**2","x**3","x**4")
chars = {
"x**2": lambda x: x**2,
"x**3": lambda x: x**3,
"x**4": lambda x: x**4
}
Matrix, names = np.zeros((x.shape[0], len(params)+1)), ["x"]
Matrix[:,0] = x[:]
for counter, param in enumerate(params, start=1):
Matrix[:,counter] = chars[param](x)
names.append(param)
panda_matrix = pd.DataFrame(Matrix)
panda_matrix.columns = names
print(panda_matrix)
但是当我只传递一个参数时,枚举认为它想把它分成一堆单独的字符。
Traceback (most recent call last):
File "C:\Users\1mike\PycharmProjects\libRL\example.py", line 41, in <module>
Matrix[:,counter] = chars[param](x)
KeyError: 'x'
Process finished with exit code 1
有什么办法吗?
解决方案
正如您所发现的,('x')
它看起来可能是一个元组,但事实并非如此。('x',)
是一个元组,并且'x',
是一个元组......但是期望您的用户知道这似乎是不合理的。
将事物转换为元组的建议很好,但要小心:tuple('ab')
is ('a', 'b')
,所以你又回到了原点。但是您可以检查是否params
是带有 的字符串isinstance(params, str)
,如果是则处理它:
if isinstance(params, str):
params = (params,)
还有另一种方法,但它可能会更好,也可能不会更好。NumPy 有一个方便的函数 ,atleast_1d()
它检查一个数组是否至少有一个维度。也许在这里矫枉过正,但很高兴知道:
>>> import numpy as np
>>> np.atleast_1d('x**2')
array(['x**2'], dtype='<U4')
你总是可以用tuple()
.
推荐阅读
- javascript - muuri 拖放在 Safari Mac 上不起作用
- machine-learning - 大图像上的目标检测训练
- laravel - vue laravel | GTM 集成
- java - 如何在 ListView 中仅显示一列数据?
- angular - 组件未加载到路由器插座中
- amazon-web-services - EKS 中的节点不解析 RDS 的 DNS 名称(IP 工作)
- javascript - 是否可以在不转译的情况下从 Ecmascript5 脚本中使用 Ecmascript6 脚本?
- excel - 无法将参数传递给循环内的函数调用
- android - 如何使用 android 7.1 在 rk3288 上设置权限?
- mongodb - 无法使用 presto 从 mongodb 获取记录