我需要将列表中的所有元素截断/舍入/对齐到8个字符.输入列表可以包含int(永远不会太长)、str(可以截断)和浮点数为floatfloat64str.

下面是我的代码示例:

data = [12452, "too much characters", 0.12457544512, -0.12457544512, "-1245154.8"]
processedData = []

for d in data:
    processedValue = str(d)
    if len(processedValue) > 8 and '.' in processedValue:
        decIndex = processedValue.index(".")
        processedValue = str(round(float(processedValue), 8 - (decIndex + 1)))
    elif len(processedValue) > 8:
        processedValue = processedValue[:8]

    processedData.append(processedValue.rjust(8, " "))

print(processedData)

输出和期望输出:

['   12452', 'too much', '0.124575', '-0.12458', '-1245150.0'] # Output
['   12452', 'too much', '0.124575', '-0.12458', '-1245155'] # Desired Output

当小数点接近8个字符的末尾时,我的值不会在正确的索引处四舍五入.当我用if替换elif条件时,长度是正确的,但最后一个数字仍然是错误的.我try 了一些其他的改变,最终引入了其他值的错误.

推荐答案

我会用f-strings来设置字符串格式.

  • 使用isinstance()内置函数
  • 一个自定义函数is_float(s),如果值或字符串可以转换为float(无一例外),则返回True.

然后,您可以将pad保留为一个固定宽度的字符串,该字符串由8个字符组成,长度为format literal :8,甚至可以使用:.0f将其四舍五入为一个整数表示,小数点后0位.或者使用这两个组合::8.0f-全部在要格式化的表达式后面的大括号内(这里是dfloat(d)):

f"{float(d):8.0f}" if isinstance(d, float) or is_float(d) else f"{d:8}"

在开头包括一点调试打印:

import math
data = [12452, "too much characters", 0.12457544512, -0.12457544512, "-1245154.8"]
print(f"input: {data}")
print(f"dt: {[type(d) for d in data]}")
def is_float(s):
    try:
        float(s)
    except ValueError:
        return False
    return True


processedData = []
for d in data:
    processedValue =  f"{float(d):8.0f}" if isinstance(d, float) or is_float(d) else f"{d:8}"
    print(processedValue)
    if len(processedValue) > 8 and '.' in processedValue:
        decIndex = processedValue.index(".")
        processedValue = str(round(float(processedValue), 8 - (decIndex + 1)))
    elif len(processedValue) > 8:
        processedValue = processedValue[:8]
    processedData.append(processedValue.rjust(8, " "))

print(f"output: {processedData}")

打印为预期的最后一行:

input: [12452, 'too much characters', 0.12457544512, -0.12457544512, '-1245154.8']
dt: [<class 'int'>, <class 'str'>, <class 'float'>, <class 'float'>, <class 'str'>]
   12452
too much characters
       0
      -0
-1245155
output: ['   12452', 'too much', '       0', '      -0', '-1245155']

另见:

Python相关问答推荐

覆盖Django rest响应,仅返回PK

如果索引不存在,pandas系列将通过索引获取值,并填充值

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

Python 3.12中的通用[T]类方法隐式类型检索

通过优化空间在Python中的饼图中添加标签

Python在tuple上操作不会通过整个单词匹配

如果值不存在,列表理解返回列表

使用groupby Pandas的一些操作

numpy卷积与有效

如何获得每个组的时间戳差异?

为什么抓取的HTML与浏览器判断的元素不同?

使用Python从URL下载Excel文件

幂集,其中每个元素可以是正或负""""

Polars将相同的自定义函数应用于组中的多个列,

如何使用正则表达式修改toml文件中指定字段中的参数值

如何在Python Pandas中填充外部连接后的列中填充DDL值

Beautifulsoup:遍历一个列表,从a到z,并解析数据,以便将其存储在pdf中.

Scipy差分进化:如何传递矩阵作为参数进行优化?

文本溢出了Kivy的视区