Как сделать логические выражения короче? или или или или или - PullRequest
1 голос
/ 05 февраля 2012
var = raw_input()

if "0" in var or "1" in var or "2" in var or "3" in var or "4" in var or "5" in var or "6" in var or "7" in var or "8" in var or "9" in var:
    print "yay"
else:
    print: ":("

Есть ли способ сделать его короче, чтобы я не записывал все цифры? Это нормально, если это (0,10), что если это (0, 10000)

Можно ли здесь как-то использовать списки?

Ответы [ 7 ]

12 голосов
/ 05 февраля 2012
any(str(i) in var for i in range(10))
5 голосов
/ 05 февраля 2012

Регулярные выражения в этом случае довольно лаконичны:

import re
if re.search(r"\d", str):
  print "yay"
else
  print ":("

Или даже короче:

print "yay" if re.search(r"\d", str) else ":("
4 голосов
/ 05 февраля 2012

Я хочу убедиться, что в строке есть цифра, а затем преобразовать ее в целое число. Также мне нужно убедиться, что в строке нет других символов, кроме чисел

Для этого вы можете применить int() к прочитанной вами строке, перехватывая ValueError исключений:

def read_int(prompt):
    while True:
        var = raw_input(prompt)
        try:
            val = int(var)
            if val > 0: return val
            print 'the number must be positive, try again'
        except ValueError as ex:
            print 'invalid number, try again'

print read_int('enter a positive integer: ')
1 голос
/ 05 февраля 2012

Лучший ответ, конечно,

print 'yay' if any(c in '0123456789' for c in var) else ':('

любой легко поймет, почему

редактировать 1

Нет, это не самый лучший ответ, потому что он самый медленный из следующих методов.
Я люблю регулярные выражения, но я не мог себе представить, что решение с использованием регулярных выражений будет самым быстрым.
Даже использование set () быстрее.

var = '''For all his fame and celebration, William Shakespeare remains a mysterious figure
with regards to personal history. There are just two primary sources for information
on the Bard: his works, and various legal and church documents that have survived from
Elizabethan times. Naturally, there are many gaps in this body of information, which
tells us little about Shakespeare the man. 
William Shakespeare was born in Stratford-upon-Avon, allegedly on April 23, 1564.'''

from time import clock
import re


n = 1000


te = clock()
for i in xrange(n):
    b = any(c in ('0123456789') for c in var)
print clock()-te


ss = set('0123456789')
te = clock()
for i in xrange(n):
    b = ss.intersection(var)
print clock()-te


te = clock()
for i in xrange(n):
    b = re.search('\d',var)
print clock()-te


regx = re.compile('\d')
te = clock()
for i in xrange(n):
    b = regx.search(var)
print clock()-te

результат

0.157774521622
0.0335822010898
0.0178648403638
0.00936152499829

редактировать 2

По Jove!
shensei на самом деле лучший ответ.
Просто вопреки тому, что я себе представлял!

from time import clock
import re


n = 1000

te = clock()
for i in xrange(n):
    b = any(dig in var for dig in '0123456789')
print clock()-te

результат

0.00467852757823

Я пришел к выводу, что исследование var на for dig in var действительно супер-гипер-быстрое.
Я только знал, что это было очень быстро.

редактировать 3

Никто не указал, что время выполнения решения Шенсея зависит от содержания анализируемой строки:

from time import clock
n = 1000

var = '''For all his fame and celebration, William Shakespeare remains a mysterious figure
with regards to personal history. There are just two primary sources for information
on the Bard: his works, and various legal and church documents that have survived from
Elizabethan times. Naturally, there are many gaps in this body of information, which
tells us little about Shakespeare the man. 
William Shakespeare was born in Stratford-upon-Avon, allegedly on April 00, 0000.'''

te = clock()
for i in xrange(n):
    b = any(dig in var for dig in '0123456789')
print clock()-te 

var = '''For all his fame and celebration, William Shakespeare remains a mysterious figure
with regards to personal history. There are just two primary sources for information
on the Bard: his works, and various legal and church documents that have survived from
Elizabethan times. Naturally, there are many gaps in this body of information, which
tells us little about Shakespeare the man. 
William Shakespeare was born in Stratford-upon-Avon, allegedly on April 99, 9999.'''

te = clock()
for i in xrange(n):
    b = any(dig in var for dig in '0123456789')
print clock()-te 

дает результаты

0.0035278226702
0.0132472143806

Использование скомпилированного регулярного выражения, которое занимает 0,00936152499829 секунд, в худшем случае кажется более быстрым, чем решение Шенсей. Но на самом деле, если время компиляции регулярного выражения включено в измерение времени, реальное время выполнения составляет 0,0216940979929 секунд.
Тогда решение Шенсея остается самым быстрым методом.

0 голосов
/ 05 февраля 2012

Из комментария OP: "" "Я хочу убедиться, что в строке есть цифра, а затем преобразовать ее в целое число. Также мне нужно убедиться, что в строке нет других символов, кроме чисел -" ""

Это тривиально в Python: просто сделайте "var.isdigit()" - .isdigit является строковым методом.

Рекомендованный способ извлечения чисел из строк:

try:
    result = int(var)
except ValueError:
    # put error handler code here
0 голосов
/ 05 февраля 2012
var = raw_input()
list_of_strings = map(str, range(10))
if var in list_of_strings:
    print 'yay!'
else:
    print ':('

Или приведите raw_input к строке:

try:
    var = int(raw_input())
except ValueError as e:
    var = int(raw_input('Please enter a number!'))
if var in range(10):
    print 'yay'
else:
    print ':('

Примечание: мой первый пример делает дополнительный шаг для преобразования списка чисел в список строк. Мой второй пример идет противоположным путем и преобразует входные данные из строки в число.

0 голосов
/ 05 февраля 2012

В зависимости от размера 'var' и количества значений вам может быть лучше использовать наборы.

values = set(map(str, range(10000)))
print(not set(var).isdisjoint(values))

10000 значений не имеет смысла, если var = raw_input(), но я думаю, у вас естьдругой вариант использования.

...