Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 2.7 计算python格式字符串的预期值数_Python 2.7_Format - Fatal编程技术网

Python 2.7 计算python格式字符串的预期值数

Python 2.7 计算python格式字符串的预期值数,python-2.7,format,Python 2.7,Format,我有一个方法,它接收用户提供的格式字符串和一组值,并使用它们将输出写入屏幕 def makestring(fmt, vals): s = fmt.format(*vals) return s fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}' threevalues = [(x+1)/7. for x in range(3)] makestring(fmt_expecting_three, threevalues)

我有一个方法,它接收用户提供的格式字符串和一组值,并使用它们将输出写入屏幕

def makestring(fmt, vals):
    s = fmt.format(*vals)
    return s

fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}'

threevalues = [(x+1)/7. for x in range(3)]

makestring(fmt_expecting_three, threevalues)
产生

'a=0.14, b=0.2857, c=0.4'
我想执行一个测试,以发现值的数量与格式的“预期”匹配

我在下面展示了一个丑陋的测试,如果您没有将
maxcheck
设置得足够高,它可能会给出错误的结果。是否有一种更自然、不那么丑陋的方法来确定期望值是多少

def checkit(fmt, maxcheck=None):
    if maxcheck == None:
        maxcheck = 10
    for i in range(maxcheck-1, 0, -1):
        try:
            fmt.format(*range(i))
        except:
            return i+1

fmt_expecting_three = 'a={:0.2f}, b={:0.4f}, c={:0.1f}'

checkit(fmt_expecting_three)
返回

3
2 pi={:0.2f}, e={:0.4f}
1 pi={:0.2f}, e={q
1 {{}
1 {}wow
0 wow
1 {}

对于这种情况,我倾向于看Python解释器解决问题的方式,而不是重新发明轮子

我找到了一个名为
countformat()
。(这也是。)

下一步是看看这个函数是公开的,还是严格地说是C。看起来答案是否定的,所以我可能只是复制他们所做的任何事情,而是用Python来做。编写正则表达式可能更有效,但C函数至少让您了解了如何定义正则表达式

一般算法如下:

  • 将level设置为0,count设置为0
  • 遍历格式字符串。对于每个字符:
  • 如果遇到开头格式标记
    [
    {
    ):
    • 如果级别为0,则递增计数
    • 增量级别
  • 否则,如果遇到结束格式标记
    ]
    }
    • 如果级别为0,则递减计数
    • 减量水平
  • 否则,如果您找到其他标记
    &
    \t
    • 什么也不做
  • Else(其他字符):
    • 如果级别为0,则递增计数
  • 返回计数

尽管学习正则表达式是痛苦的,但它是值得的

修改自

返回

3
2 pi={:0.2f}, e={:0.4f}
1 pi={:0.2f}, e={q
1 {{}
1 {}wow
0 wow
1 {}

我愿意和你一起做这件事。这可以确保字符串实际上是一个有效的格式字符串,同时为您提供有关格式的所有信息。 采取:

由此,您可以通过检查第二项是否为无来计算金额

>>> sum(1 for _, field_name, _, _ in l if field_name is not None)
2
因此,您可以使用:

def count_formats(format_string):
    f = string.Formatter()
    formats = f.parse(format_string)
    return sum(1 for _, field_name, _, _ in formats if field_name is not None)

但是,这不适用于嵌套格式。因此,我们需要检查什么可以嵌套:

>>> list(f.parse('{}'))
[('', '', '', None)]
>>> list(f.parse('{:{}}'))
[('', '', '{}', None)]
>>> list(f.parse('{{}:{}}'))
ValueError: Single '}' encountered in format string
>>> list(f.parse('{!{}:{}}'))
ValueError: Single '}' encountered in format string
所以我们只需要检查格式规范,看看是否有任何嵌套格式。因此,如果您愿意,可以将
count\u格式
更改为嵌套格式:

def count_formats(format_string):
    def nested(s):
        for hit in f.parse(s):
            yield hit
            if hit[2]:
                for nested_hit in nested(hit[2]):
                    yield nested_hit
    f = string.Formatter()
    formats = nested(format_string)
    return sum(1 for _, field_name, _, _ in formats if field_name is not None)

因为我是花括号,我的C不是很好。我已经几十年没有研究过它了,所以我不知道C是如何工作的。你能用Python回答吗?谢谢@哦,我不会为您编写Python代码,但我确实为您将C翻译成了伪代码。英语也是一种没有大括号的语言。然而,这是完全错误的,因为无论期望值是多少,它总是返回零。简单的例子:
{}
另一个:
pi={:0.2f},e={:0.4f}
。你不必“为我编写Python代码”,但别忘了在发布之前至少测试一下你的答案的有效性。对于Python的“新风格”格式,我想知道仅仅计算
{
的数量是否至少可能是答案的开始,也许是确认了相同数量的
}
?或者也许你发布的伪代码中有一个小错误?@Peilonrayz这是我到目前为止得到的,理想的情况是有比我更好的人来发布更好的答案。如前所述,我对Python的非数字用法还不熟悉。如有任何改进或新答案,将不胜感激!我将只对简单的格式和数字值使用它,但是一个更一般的答案会更好。比我的好!