2015-11-19 2 views
2

Я прочитал условия «> 0», «< 60» и т. Д. Из XML-файла. Каков наилучший способ их преобразования на язык python для сравнения? Пример кода является то, что я хочу сделать:Преобразование строки "> 0" в python> 0

if str == ">0": 
     if x > 0: 
      print "yes" 
     else: 
      print "no" 
    elif str == "<60": 
     if x < 60: 
      print "yes" 
    ... 

ответ

1

Если вы очень уверены в том, что данные в файле XML правильно продезинфицировать, то вы можете использовать eval().

'yes' if eval(str(x) + op) else 'no' 

Хотя это решение гораздо проще, чем другие ответы, это также, вероятно, медленнее (но я не проверял это).

8

Я хотел бы использовать regex и operator.

from operator import lt, gt 
import re 

operators = { 
    ">": gt, 
    "<": lt, 
} 

string = ">60" 
x = 3 

op, n = re.findall(r'([><])(\d+)', string)[0] 

print(operators[op](x, int(n))) 

В зависимости от вашей строки регулярное выражение может быть изменено.

+1

Ударьте меня на это, вот-вот опубликуйте тот же базовый ответ. Я бы пропустил регулярное выражение для простого случая, хотя я признаю, что он был каким-то хакивым в любом случае; 'digits = somestr.lstrip ('><=')', 'op = somestr [: - len (цифры)]', 'n = int (цифры)'. Я также собирался включить ''> = ': operator.ge' и '' <=': operator.le' в 'dict' для полноты неравенства. – ShadowRanger

+0

@ShadowRanger Я думал использовать regex, потому что я считаю его более гибким в случае, когда строки OP становятся более сложными в будущем. Но использование 'lstrip()' является хорошим способом, который он должен учитывать. – Delgan

+0

Да, регулярное выражение прекрасно в этом случае (оно находится на границе между «use simple string ops» и «use regex», и только мое философское возражение против чрезмерного использования регулярных выражений заставляет меня ошибаться на стороне «no regex»). Я просто комментировал альтернативы (я не хотел публиковать в основном избыточный ответ, когда у вас хорошо, только чтобы включить эту крошечную настройку). – ShadowRanger

0

Возможно, просто используйте ломтик?

string = "<60" 
x = 3 

op = string[0] 
number = int(string[1:].strip()) 

if op == '>': 
    print 'yes' if x > number else 'no' 
else: 
    print 'yes' if x < number else 'no' 

Выход:

yes 
Смежные вопросы