Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以整数形式计算字符串中所有八进制值的Python方法_Python_String_Eval - Fatal编程技术网

以整数形式计算字符串中所有八进制值的Python方法

以整数形式计算字符串中所有八进制值的Python方法,python,string,eval,Python,String,Eval,例如,我有一个字符串看起来像“012+2-01+24”。我希望能够快速(更少的代码)计算该表达式 我可以对字符串使用eval(),但我不希望012以八进制形式(10)表示,我希望它以int(12)表示 我的解决方案是可行的,但并不优雅。我在某种程度上假设有一种很好的蟒蛇式方法可以做到这一点 我的解决方案: #expression is some string that looks like "012 + 2 - 01 + 24" atomlist = [] for atom in express

例如,我有一个字符串看起来像
“012+2-01+24”
。我希望能够快速(更少的代码)计算该表达式

我可以对字符串使用eval(),但我不希望
012
以八进制形式(10)表示,我希望它以int(12)表示

我的解决方案是可行的,但并不优雅。我在某种程度上假设有一种很好的蟒蛇式方法可以做到这一点

我的解决方案:

#expression is some string that looks like "012 + 2 - 01 + 24"
atomlist = []
for atom in expression.split():
    if "+" not in atom and "-" not in atom:
        atomlist.append(int(atom))
    else:
        atomlist.append(atom)
#print atomlist
evalstring = ""
for atom in atomlist:
    evalstring+=str(atom)    
#print evalstring
num = eval(evalstring)
基本上,我撕开字符串,找到其中的数字并将其转换为整数,然后用整数重新生成字符串(基本上删除前导0,除非0本身是一个数字)


如何才能做得更好?

我很想使用正则表达式来删除前导零:

>>> re.sub(r'\b0+(?!\b)', '', '012 + 2 + 0 - 01 + 204 - 0')
'12 + 2 + 0 - 1 + 204 - 0'
这将删除每个数字开头的零,除非该数字完全由零组成:

  • 第一个
    \b
    匹配单词(标记)边界
  • 0+
    匹配一个或多个连续零
  • (?!\b)
    ()禁止在零序列后跟令牌边界的情况下进行匹配
与基于
split()

>>> re.sub(r'\b0+(?!\b)', '', '012+2+0-01+204-0')
'12+2+0-1+204-0'

可以使用lstrip()在一行中删除任何前导零:

>>> eval("".join(token.lstrip('0') for token in s.split()))
37

我想这样做:

>>> s = '012 + 2 + 0 - 01 + 204 - 0'
>>> ' '.join(str(int(x)) if x.isdigit() else x for x in s.split())
'12 + 2 + 0 - 1 + 204 - 0'

如果您也要处理它们,请使用
float()

int
不假定前导零表示八进制数:

In [26]: int('012')
Out[26]: 12
因此,您可以使用以下代码安全地计算表达式

from operator import add, sub
from collections import deque

def mapper(item, opmap = {'+': add, '-': sub}):
    try: return int(item)
    except ValueError: pass

    return opmap[item]

stack = deque()
# if item filters out empty strings between whitespace sequences
for item in (mapper(item) for item in "012 + 2 - 01 + 24".split(' ') if item):
    if stack and callable(stack[-1]):
        f = stack.pop()
        stack.append(f(stack.pop(), item))
    else: stack.append(item)

print stack.pop()

不是一行程序,但它是安全的,因为您可以控制所有可以执行的函数。

这一点很好!我不确定用我的方法有什么简单的方法来解决这个问题。无论如何,我都希望得到一个好的答案。在我的特殊情况下,唯一的操作是+和-解决问题的一种方法是使用
token.lstrip('0'),如果token.lstrip('0')else token
或其他什么。我需要开始学习常规表达式的另一个原因是:
eval('012')
将在Python 3中引发一个
SyntaxError
:)@RikPoggi:这是一个非常有趣的旁注…+1出于自私的原因;这是我想到的第一件事。