停止 Python enumerate() 将字符串拆分为字符
Stop Python enumerate() from splitting a string into characters
我有一个函数,它接受关键字参数列表并根据关键字列表计算一堆结果,我正在使用枚举来构造循环以输出数据 table所有的结果。当参数列表大于一个时,一切都很好,但是当只传递一个参数时,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)
就像我说的,当有多个参数可供枚举时,我得到了我想要的:
但是当我只传递一个参数时,enumerate 认为它想把它分成一堆单独的字符。
Traceback (most recent call last):
File "C:\Usersmike\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')
是 ('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()
的元组。
我有一个函数,它接受关键字参数列表并根据关键字列表计算一堆结果,我正在使用枚举来构造循环以输出数据 table所有的结果。当参数列表大于一个时,一切都很好,但是当只传递一个参数时,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)
就像我说的,当有多个参数可供枚举时,我得到了我想要的:
但是当我只传递一个参数时,enumerate 认为它想把它分成一堆单独的字符。
Traceback (most recent call last):
File "C:\Usersmike\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')
是 ('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()
的元组。