参数化的字符串格式会产生意外的结果

2024-04-29 20:16:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,它包含一个微数据集的数据字典,包括字符串字段的字段宽度,这些字段是零填充的。你知道吗

我最终希望使用这个数据帧为每个变量创建一个转换器字典,以便传递给pd.read_csv调用,其中转换器函数lambdas一个字符串格式化程序,其参数化宽度随每个变量而变化。你知道吗

换句话说,我想生成一个函数字典,每个函数都有自己的字符串格式模板,这样每个变量都可以在下游加载适当的零填充。你知道吗

  • 为此,我对行进行迭代,并使用表示宽度的变量创建具有可变宽度的字符串格式化程序表达式。这似乎管用。

  • 我将此格式化程序存储在字典中,每行有一个条目。

然而,问题是,当我随后输入字典并传递一个参数时,不管字符串宽度参数是什么,它的长度都是4。你知道吗

示例:

# dict for storing the mapping
coll={}

# mock data (var name and associated width)
df=pd.DataFrame(data={'nme':['a','b','c','d'],'width':[2,2,3,4]})

# iterate rows
for _,dta in df.iterrows():

    # create variable width format string from width variable
    # mix of old / new string format approach

    formatstring = ('{:0>%s}'%dta.width)

    # turn string into a function, with string to be padded as argument

    formatfunc = lambda x: formatstring.format(x)
    coll[dta.nme]=formatfunc

    print 'var {}; width {}'.format(dta.nme, dta.width)
    print formatstring

运行的输出如下——值得注意的是,字符串格式化程序看起来很干净,宽度可变:

var a; width 2
{:0>2}
var b; width 2
{:0>2}
var c; width 3
{:0>3}
var d; width 4
{:0>4}

但是当我在coll字典中输入一个条目时,我总是得到长度为4的填充。我错过了什么,这是一种实用的方法吗?你知道吗

coll['a'](3)
'0003'

这里我期望键a的长度为2的填充字符串。相反,我得到了长度4。你知道吗


Tags: 数据函数字符串程序format参数string字典
1条回答
网友
1楼 · 发布于 2024-04-29 20:16:19

这是因为lambda在计算时使用了全局变量formatstringformatstring等于{:0>4},上一次迭代中设置给它的值。

另一个简单的例子:

y = 5
f = lambda x: print(x+y)
f(2) # prints 7
y = 10
f(2) # prints 12


如何解决这个问题

解决这个问题的一个方法是完全去掉lambdas。一个不切实际的例子:

df.set_index('nme',inplace=True)
coll = df.to_dict(orient='index')   

'0'*coll['a']['width']+str(3)  # prints '003'

如果需要,可以将最后一行转换为函数(或lambda)。你知道吗

相关问题 更多 >