繁体   English   中英

Python中带有可变数字参数的字符串格式

[英]String formatting in Python with variable number arguments

我有一个看起来像的dict

A = {
    'test1':{'q0':[0.123,0.234],'phi0':[0.124,0.4325],'m':[9.42,0.3413]},
    'test2':{'q0':[0.343,0.353],'phi0':[0.2341,0.235]},
    'test3':{'q0':[0.343,0.353],'phi0':[0.2341,0.235],'m':[0.325,0.325],'z0':[0.234,0.314]}
    }

我想打印每个字典:

'test1':                 q0=0.123(0.234) phi0=0.123(0.4325) m=9.42(0.3413)
'test2':                 q0=0.343(0.353) phi0=0.2341(0.235)
'test3': z0=0.234(0.314) q0=0.343(0.353) phi0=0.2341(0.235) m=0.325(0.325)

在Python 3中如何使用string.format() 由于每个子词典都有可变数量的“参数”,因此我不确定如何使用一些列表/词典理解来实现它。 另外,如果我想在该参数丢失的情况下保留一些空间(如所示),该怎么办? 每个字典最多具有五个不同的参数(q0,phi0,m,c,z0)。 我想把它打印到终端上,所以我不需要花哨的东西,但是我希望它可以更容易阅读。

请注意,字典是无序的数据结构,因此除非使用它们的有序等效collections.OrderedDict()否则您不能期望它们在打印项目时有任何次序。 不过,您可以在str.join()方法中使用生成器表达式:

In [4]: for key, value in A.items():
    print(','.join(("{}: {}={}({})".format(key, t1,t2,t3) for t1, (t2, t3) in value.items())))
   ...:     
test1: q0=0.123(0.234),test1: phi0=0.124(0.4325),test1: m=9.42(0.3413)
test3: q0=0.343(0.353),test3: phi0=0.2341(0.235),test3: m=0.325(0.325),test3: z0=0.234(0.314)
test2: q0=0.343(0.353),test2: phi0=0.2341(0.235)

还要注意,由于我们正在执行以下内联解压缩,如果列表中的项目数大于/小于两个,则可能会引发ValueError。

for t1, (t2, t3) in value.items()

因此,请确保解包变量的数量与列表中的项目数量匹配。

检查子字典的键中是否有'z0' ,并对那些项应用与没有该键的键稍有不同的字符串操作。 看起来有点脏,但完全可以产生输出:

for k,v in A.items():
    if 'z0' in v:
        print (k,":","{}={}({})".format('z0',v['z0'][0],v['z0'][1]), " ".join("{}={}({})".format(e,t[0],t[1]) for e,t in v.items() if 'z0' not in e))
    else:
        print (k,":                "," ".join("{}={}({})".format(e,t[0],t[1]) for e,t in v.items()))

结果:

test1 :                 q0=0.123(0.234) phi0=0.124(0.4325) m=9.42(0.3413)
test2 :                 q0=0.343(0.353) phi0=0.2341(0.235)
test3 : z0=0.234(0.314) q0=0.343(0.353) phi0=0.2341(0.235) m=0.325(0.325)

注意:如果确实需要在test s周围使用单引号,即用'test1'代替test1 ,则可以在我的两个print语句中,在k的左右添加"'"print ("'",k,"'",...

使用嵌套循环:

for m,x in A.items():
    for y,z in x.items():
        print(m,'{0}='.format(y), z[0],'({0})'.format(z[1]))

由于测试和参数都在字典中,因此您可以首先对它们进行排序以确保顺序一致。 简单排序可能无法进行,尽管好像您拥有test13 ,默认情况下in将出现在test1之后。 您可以使用Python库natsort来解决此问题。

由于每一组参数可以有缺失值,快速搜索可以用来创建所有的列表cols是需要的。 然后,在打印缺少值的行时可以保留空间:

from natsort import natsorted

A = {
    'test1':{'q0':[0.123,0.234],'phi0':[0.124,0.4325],'m':[9.42,0.3413]},
    'test2':{'q0':[0.343,0.353],'phi0':[0.2341,0.235]},
    'test3':{'q0':[0.343,0.353],'phi0':[0.2341,0.235],'m':[0.325,0.325],'z0':[0.234,0.314]},
    'test13':{'q0':[0.343,0.353],'z0':[0.234,0.314]}
    }

sorted_tests = natsorted(A.items())     # Ensure test13 is numerical sorted correctly
# Create a list of all required cols
cols = set()

for test, params in sorted_tests:
    cols.update(params.keys())

cols = sorted(cols)    

for test, params in sorted_tests:
    row = [(col, params.get(col, [])) for col in cols]
    cells = []
    for p, values in row:
        if values:
            cells.append('{:20}'.format('{}={}({})'.format(p, values[0], values[1])))
        else:
            cells.append('{:20}'.format(''))

    print("{:6} : {}".format('{}'.format(test), ''.join(cells)))

这将为您提供以下输出:

test1  : m=9.42(0.3413)      phi0=0.124(0.4325)  q0=0.123(0.234)                         
test2  :                     phi0=0.2341(0.235)  q0=0.343(0.353)                         
test3  : m=0.325(0.325)      phi0=0.2341(0.235)  q0=0.343(0.353)     z0=0.234(0.314)     
test13 :                                         q0=0.343(0.353)     z0=0.234(0.314)

请尝试以下基于for循环的代码for这些代码会产生排序的输出:

outlist = []
for a in A:
    outstr = a+":"
    for aa in ('z0', 'q0','phi0','m','c'):
        if aa in A[a]:
            outstr += aa+"="+str(A[a][aa][0])+"("+str(A[a][aa][1])+") "
        else:
            outstr += "                "
    outlist.append(outstr)

for i in sorted(outlist):
    print(i)

输出:

test1:                q0=0.123(0.234) phi0=0.124(0.4325) m=9.42(0.3413)                 
test2:                q0=0.343(0.353) phi0=0.2341(0.235)                                 
test3:z0=0.234(0.314) q0=0.343(0.353) phi0=0.2341(0.235) m=0.325(0.325)          

尝试这个:-

A = {
    'test1':{'q0':[0.123,0.234],'phi0':[0.124,0.4325],'m':[9.42,0.3413]},
    'test2':{'q0':[0.343,0.353],'phi0':[0.2341,0.235]},
    'test3':{'q0':[0.343,0.353],'phi0':[0.2341,0.235],'m':[0.325,0.325],'z0':[0.234,0.314]}
    }
for i,j in A.items():
    print i+':',
    for x,y in j.items():
        print "{}= {}({})".format(x,y[0],y[1]),
    print 
#output is same as expected

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM