在 Python 中迭代整数的最佳实践是什么?我发现我需要经常这样做,通常会产生冗长的结果。例如,这是我为 Project Euler 编写的两个函数问题:
def is_permutation_of(n, m):
""" Return True if n is a permutation of m, else False
"""
if len(str(n)) != len(str(m)):
return False
for d in str(n):
if d not in str(m):
return False
return True
还有一个:
def has_even_digit(n):
""" Return True if n has an even digit, else False
"""
evens = ['0', '2', '4', '6', '8']
for e in evens:
if e in str(n):
return True
return False
除了冗长之外,1) 必须有与每个类型转换相关的计算开销,以及 2) 感觉完全不雅。还有另一种方法来处理这个问题吗?我是否以完全错误的方式处理这些函数,即我是否应该不必对整数进行迭代?
感谢您的帮助。
最佳答案
我更喜欢我的变体而不是你的 is_permutation_of
:
def is_perm(a,b): return sorted(str(a)) == sorted(str(b))
而且我认为这对 has_even_digit
更好
def has_even_digit(n):
evens=set(['0', '2', '4', '6', '8'])
return any(c in evens for c in str(n))
或者,甚至使用元组而不是集合:
def has_even_digit(n):
return any(c in ('0', '2', '4', '6', '8') for c in str(n))
编辑
从评论线程来看,我觉得你正在寻找这样的东西:
# pseudo code -- don't use -- not syntactically correct
for d in 123456: # integer
# do something with each digit...
这不起作用,因为整数在 Python 中不支持迭代。此外,没有真正需要像整数迭代这样的东西,因为它非常惯用并且很容易用字符串来完成。
这是一个 Python 框架,可以处理字符串但生成单个整数:
for d in [int(c) for c in str(123456)]:
# d is a left (most significant) to right integer digit - do what you want with it...
如果你想要从右到左的相同数字:
for d in [int(c) for c in str(123456)[::-1]]:
# Now right (least significant digit) to left (most significant digit)
将这两个简单案例与使用整数或长整数进行实际数学运算进行比较:
def int_iter(n,reverse=False):
rtr=[]
if not isinstance(n, (int,long)):
raise ValueError('n must be int or long')
while n:
rtr.append(n%10)
n/=10
if reverse:
return rtr[::-1]
else:
return rtr
使用字符串确实更容易,而且可能更快。如果您需要超快的速度,请使用 C 语言。
关于python - 迭代整数的 Pythonic 或最佳实践方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14611008/