Массив объединения C++ и Вар?

Я думаю, что вам нужно захватить регулярное выражение @ + буквы / цифры / подчеркивание, которое равно "@(\w+) (соответствует @, затем 1 или более букве / цифре / подчеркиванию и создать группу с ними), поданным на функция замены

import re
mydict = {'Cost1' : 10, 'Cost2' : 5, 'Cost3' : 1, 'Revenue1' : 10}
string = '@Cost1 + (@Cost2 + @Cost3) / @Revenue1 * 1.2'

expression = re.sub("@(\w+)",lambda m : str(mydict.get(m.group(1),0)),string)

результат:

'10 + (5 + 1) / 10 * 1.2'

Этот метод очень эффективен, потому что он использует поиск в словаре вместо циклических, чтобы заменить и создать столько строк как есть переменные.

обратите внимание, что любая неизвестная переменная выдает 0. Если вы не хотите, чтобы это использовалось, используйте mydict[m.group(1)], чтобы вызвать ошибку ключа.

lambda также не является обязательным. Вместо этого вы можете написать реальную функцию, если она принимает объект match в качестве входных данных и возвращает строку в качестве выходных данных:

def repfunc(m)
    return str(mydict.get(m.group(1),0))

re.sub("@(\w+)",repfunc,string)

(поэтому мы конвертируем в строку после получения значения)

Если у вас есть это выражение, вы можете применить оценщик (eval является самым простым, но менее безопасным, ast.literal_eval не будет работать, потому что он не поддерживает операции, но есть и другие, например, [ 1111] сторонний модуль (которому можно подать список переменных, который еще больше упростит ответ), или другие примеры здесь: Оценка математического выражения в строке )

7
задан timrau 15 August 2012 в 00:02
поделиться

4 ответа

Как насчет

union {
    struct {
        int x;
        int y;
    };
    int v[2];
};

править:

union a {
    struct b { int first, second; } bee;
    int v[2];
};

Ужасный, но это более точно

14
ответ дан 6 December 2019 в 04:58
поделиться

Так как Вы используете C++ и не C, и так как они имеют те же типы, почему не только делают x ссылкой на v [0] и y ссылка на v[1]

18
ответ дан 6 December 2019 в 04:58
поделиться

Попробуйте это:

template<class T>
struct U1
{
    U1();
    T   v[2];
    T&  x;
    T&  y;
};

template<class T>
U1<T>::U1()
    :x(v[0])
    ,y(v[1])
{}

int main()
{
    U1<int>   data;

    data.x  = 1;
    data.y  = 2;
}
6
ответ дан 6 December 2019 в 04:58
поделиться

В зависимости от того, каков "Скаляр", да, можно сделать это в C++. Синтаксис почти точно (возможно, даже точно точно, но я ржав на объединениях), что Вы записали в своем примере. Это совпадает с C, кроме существуют ограничения на типы, которые могут быть в объединениях (IIRC, у них должен быть конструктор по умолчанию). Вот соответствующая статья Wikipedia.

1
ответ дан 6 December 2019 в 04:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: