首页 > 解决方案 > 如何在 for 循环中将元素添加到列表并打印单个列表?

问题描述

我在解决这个任务时感到困惑:

在工厂里,打印机打印盒子的标签。对于一种盒子,打印机必须使用颜色,为简单起见,使用从 a 到 m 的字母命名。

打印机使用的颜色记录在控制字符串中。例如,一个“好”的控制字符串是 aaabbbbhaijjjm,这意味着打印机使用了 3 次颜色 a、4 次颜色 b、1 次颜色 h 和 1 次颜色 a...

有时会出现问题:缺少颜色、技术故障和产生“坏”控制字符串,例如 aaaxbbbbyyhwawiwjjjwwm 的字母不是从 a 到 m。

您必须编写一个函数printer_error,它给定一个字符串,将打印机的错误率作为一个字符串返回,该字符串表示一个有理数,其分子是错误数,分母是控制字符串的长度。不要将此分数简化为更简单的表达式。

该字符串的长度大于或等于 1,并且仅包含从 a 到 z 的字母。

我的示例代码:

s = 'aaabbbbhaijjjmz'
li = []
# 97 to 109

for i in s:
    i = ord(i)
    
    if i in range(97, 109):
        
        print(0/len(s))
    
    else:
        for x in s:
            x = ord(x)
        if x > 109:
            li.append(x)
            print(x)

问题:

我想在以下步骤中挑战这个问题。我想将字符串转换为 ASCII,然后找到从 a 到 m 的范围。然后,我的程序会读取给定字符串中是否存在可接受范围。如果字符串在可接受的范围内,则打印 0/len(s)。但是,如果程序读取了一个不可接受的字符串,则任务是查找大量错误,因此,如果范围大于 109(ASCII 格式),那么我希望将这些元素添加到列表中。但是当我这样做时,我的程序会打印两个列表。请帮帮我

标签: pythonlist

解决方案


您不必将字母转换为 ASCII 码,直接比较它们。您不需要在 for 循环中将某些内容添加到列表中。如果您只想要最终的错误率,那么以下单行就足够了:

print(f"{sum(not 'a'<=x<='m' for x in s)}/{len(s)}")

如果需要,您还可以修改它以使用 for 循环,并附加任何您想要的内容:

count, li = 0, []
for x in s:
    if not 'a' <= x <= 'm':
        count += 1
        li.append(x)
print(f'{count}/{len(s)}')
print(x)

在第一种方法中,我们print使用 f 字符串。F-string 简单来说就是一个普通的字符串,其中花括号中的所有文字或代码片段都被评估,然后插入到字符串中。print(f'a {b}+{c**2}')是 的等价物print('a ', b, '+', c**2, sep=''),但为了避免空格,我需要最后一个参数,因此 f-string 编写起来更快,更容易理解。然后我使用 sum() - 内置函数对所有可迭代元素求和。内部对象是一个生成器——它类似于 for 循环,但速度更快、内存效率更高且更短。它对not 'a'<=x<='m's 的每个元素 x 求值,并逐一求和。比较结果以 int 形式求和,not 用于表示不在 a..m 范围内的字母。在这种情况下,双边比较是有用的功能。

第二个代码片段做同样的事情,但在一个循环中。li如果您不需要错误列表,请忽略所有参考。我们初始化一个计数器并遍历字符串,每次遇到一个不是来自 a..m 范围的字母时,计数器就会增加。


推荐阅读