将文本列表格式化为列
我想把一串字符串输出成两列的格式。通常把字符串列表变成“正常文本”的方法是用string.join这个方法。不过,它只能接收两个参数,所以我只能用"\n"来做成一列。我试着用一个循环在列之间加个制表符,但逻辑没有正确运行。
我找到一个ActiveState页面,上面有一种比较复杂的方法,但那是四年前的事了。现在有没有更简单的方法呢?
编辑 这是我想用的列表。
skills_defs = ["ACM:Aircraft Mechanic", "BC:Body Combat", "BIO:Biology",
"CBE:Combat Engineer", "CHM:Chemistry", "CMP:Computers",
"CRM:Combat Rifeman", "CVE:Civil Engineer", "DIS:Disguise",
"ELC:Electronics","EQ:Equestrian", "FO:Forward Observer",
"FOR:Forage", "FRG:Forgery", "FRM:Farming", "FSH:Fishing",
"GEO:Geology", "GS:Gunsmith", "HW:Heavy Weapons", "IF:Indirect Fire",
"INS:Instruction", "INT:Interrogation", "JP:Jet Pilot", "LB:Longbow",
"LAP:Light Aircraft Pilot", "LCG:Large Caliber Gun", "LNG:Language",
"LP:Lockpick", "MC:Melee Combat", "MCY:Motorcycle", "MEC:Mechanic",
"MED:Medical", "MET:Meterology", "MNE:Mining Engineer",
"MTL:Metallurgy", "MTN:Mountaineering", "NWH:Nuclear Warhead",
"PAR:Parachute", "PST:Pistol", "RCN:Recon", "RWP:Rotary Wing Pilot",
"SBH:Small Boat Handling","SCD:Scuba Diving", "SCR:Scrounging",
"SWM:Swimming", "TW:Thrown Weapon", "TVD:Tracked Vehicle Driver",
"WVD:Wheeled Vehicle Driver"]
我只是想把这个列表输出成简单的两列格式,以节省空间。理想情况下,列之间应该有标准的间距,但我可以适应。
ACM:Aircraft Mechanic BC:Body Combat
BIO:Biology CBE:Combat Engineer
CHM:Chemistry CMP:Computers
CRM:Combat Rifeman CVE:Civil Engineer
DIS:Disguise ELC:Electronics
EQ:Equestrian FO:Forward Observer
FOR:Forage FRG:Forgery
FRM:Farming FSH:Fishing
GEO:Geology GS:Gunsmith
HW:Heavy Weapons IF:Indirect Fire
INS:Instruction INT:Interrogation
JP:Jet Pilot LB:Longbow
LAP:Light Aircraft Pilot LCG:Large Caliber Gun
LNG:Language LP:Lockpick
MC:Melee Combat MCY:Motorcycle
MEC:Mechanic MED:Medical
MET:Meterology MNE:Mining Engineer
MTL:Metallurgy MTN:Mountaineering
NWH:Nuclear Warhead PAR:Parachute
PST:Pistol RCN:Recon
RWP:Rotary Wing Pilot SBH:Small Boat Handling
SCD:Scuba Diving SCR:Scrounging
SWM:Swimming TW:Thrown Weapon
TVD:Tracked Vehicle Driver WVD:Wheeled Vehicle Driver
8 个回答
3
这段话有点啰嗦,所以我把它分成了两部分。
def columns( skills_defs, cols=2 ):
pairs = [ "\t".join(skills_defs[i:i+cols]) for i in range(0,len(skills_defs),cols) ]
return "\n".join( pairs )
显然,这也可以写成一个很长很长的语句。
对于奇数个技能,这种写法也是有效的。
4
这个可以用
it = iter(skills_defs)
for i in it:
print('{:<60}{}'.format(i, next(it, "")))
你可以看看这里: 字符串格式化的例子
12
有两列数据,用制表符分开,然后把它们合成一行。可以看看 itertools 这个库,里面有一些迭代器的工具,可以帮你实现更节省空间的解决方案。
import string
def fmtpairs(mylist):
pairs = zip(mylist[::2],mylist[1::2])
return '\n'.join('\t'.join(i) for i in pairs)
print fmtpairs(list(string.ascii_uppercase))
A B
C D
E F
G H
I J
...
哎呀...被 S.Lott 抓住了(谢谢你)。
这是一个更通用的解决方案,可以处理任意数量的列和奇怪的列表。这个方法稍微修改了一下来自 S.lott 的内容,使用生成器来节省空间。
def fmtcols(mylist, cols):
lines = ("\t".join(mylist[i:i+cols]) for i in xrange(0,len(mylist),cols))
return '\n'.join(lines)