Остановить Python enumerate () от разбиения строки на символы - PullRequest
1 голос
/ 02 октября 2019

У меня есть функция, которая принимает список аргументов ключевых слов и вычисляет кучу результатов на основе списка ключевых слов, и я использую перечисление для структурирования цикла, чтобы вывести таблицу данных со всеми результатами. Все отлично работает, когда список параметров больше единицы, но когда передается только один параметр, enumerate думает, что хочет разбить это ключевое слово на отдельные буквы. Очевидный способ избежать этого - просто отбросить вызов enumerate и использовать переменную counter, но есть ли способ работать с функцией 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)

и, как я уже сказал, я получаю то, что хочу, когда для перечисления доступно несколько параметров: resulting output

, но когда я передаю только один параметр, перечисление думаетон хочет разделить это на кучу отдельных персонажей.

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

Есть ли способ обойти это?

1 Ответ

2 голосов
/ 02 октября 2019

Как вы узнали, ('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().

...