python - 迭代整数的 Pythonic 或最佳实践方法是什么?

标签 python casting type-conversion

在 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/

相关文章:

python - 行索引和列索引之间具有绝对差的矩阵

python - 将 XML 响应转换为 Pandas 数据框

c++ - 如何在不丢失顺序的情况下将 std::vector 转换为 std::set

ruby - 在 Ruby 中模拟 int64 溢出

python - 尝试安装 python3 但终端始终显示为 python 2.7.13

python - 迭代 package_data 文件并将它们复制到当前工作目录

c++ - 为什么以及何时需要转换为 char volatile&?

firebase - 在Kotlin中将长字符串转换为Int

java - 递归下降解析器 - ClassCastException

Java:在控制台中获取字符串输入并解析为 Int