python - 如何在 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 格式),那么我希望将这些元素添加到列表中。但是当我这样做时,我的程序会打印两个列表。请帮帮我
解决方案
您不必将字母转换为 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 范围的字母时,计数器就会增加。
推荐阅读
- c# - 为什么我的 Windows 服务似乎在旋转 CPU 内核
- asynchronous - 如何创建异步 Camel-kafka 消费者?
- r - 当我清除环境时,闪亮的代码可以工作,但会抛出对象'Year' not found 错误
- kubernetes - Kubernetes 网络策略和外部负载均衡器
- java - modbus4j 无法连接
- flutter - 颤动的Json解码
- javascript - 使用 innerText 从隐藏的 HTML 元素中检索文本
- python - python中非常基本的递归
- python - 列表变为“无”,试图制作一个分解程序
- java - Java Mail IMAP 花费大量时间在邮箱中获取消息,25 秒获取 20 条消息