1
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)呢

是否可以以某种方式在这里使用列表?

4

7 回答 7

12
any(str(i) in var for i in range(10))
于 2012-02-05T12:08:07.723 回答
5

在这种情况下,正则表达式非常简洁:

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

甚至更短:

print "yay" if re.search(r"\d", str) else ":("
于 2012-02-05T12:09:56.203 回答
4

我想确保字符串中有一个数字,然后将其转换为整数。我还需要确保字符串中没有其他符号,而是数字

为此,您可以应用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: ')
于 2012-02-05T12:41:28.327 回答
2

最好的答案当然是

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

天哪!
事实上, shesei的答案是最好的答案。
和我想象的相反!

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 by的探索for dig in var真的是超级超快。
我只知道它非常快。

编辑 3

没有人指出 shesei 解决方案的执行时间取决于分析字符串的内容:

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 秒的编译正则表达式似乎比 shesei 的解决方案更快。但实际上,如果将编译正则表达式的时间包括在时间测量中,那么真正执行的时间是0.0216940979929秒。
那么 shesei 的解决方案仍然是最快的方法。

于 2012-02-05T14:06:46.210 回答
0

根据“var”的大小和值的数量,使用集合可能会更好。

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

如果 10000 个值没有意义var = raw_input(),但我想你有另一个用例。

于 2012-02-05T12:41:14.000 回答
0
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 ':('

注意:我的第一个示例需要一个额外的步骤来将数字列表转换为字符串列表。我的第二个示例则相反,将输入从字符串转换为数字。

于 2012-02-05T13:48:52.777 回答
0

来自 OP 评论:“”“我想确保字符串中有一个数字,然后将其转换为整数。我还需要确保字符串中没有其他符号,而是数字 -”“”

这在 Python 中是微不足道的:只需执行 " var.isdigit()" - .isdigit 是一个字符串方法。

不过,从字符串中提取数字的推荐方法是:

try:
    result = int(var)
except ValueError:
    # put error handler code here
于 2012-02-05T16:29:53.050 回答