首先,我是Python的新手,编码很难为我开始。
所以我有一个字典格式化(由于API),如下所示。
可以添加键和值,所以我的猜测是我需要某种循环。
agilityskills = {'Archery': {'Archery': 4, 'Crossbow': 6, 'Bow': 6}, 'Pistols': {'Pistols': 6, 'Semi-Automatics': 8, 'Holdouts': 8}, 'Gymnastics': {'Gymnastics': 6, 'Balancing': 8}, 'Blades': {'Blades': 5}}
我希望它的输出为;
Archery(Bow)(Crossbow) >--------------------------------> 4(6)
Pistols(Semi-Automatics)(Holdouts) >--------------------> 6(8)
Gymnastics(Balancing) >---------------------------------> 6(8)
Blades >------------------------------------------------> 5
我不想打印这个,但是把它传递给另一个模块,所以也许将结果用作函数或变量?
答案 0 :(得分:1)
OP澄清了确切的格式可以等待,所以让我们从"业务逻辑"开始,使用pprint
只是为了更可读的第一阶段显示结果:
import pprint
agilityskills = {
'Archery': {'Archery': 4, 'Crossbow': 6, 'Bow': 6},
'Pistols': {'Pistols': 6, 'Semi-Automatics': 8, 'Holdouts': 8},
'Gymnastics': {'Gymnastics': 6, 'Balancing': 8},
'Blades': {'Blades': 5}
}
def refactor(ask):
result = []
for s in ask:
ss = [s1 for s1 in ask[s] if s1 != s]
skills = [s] + ss
scores = [ask[s][s1] for s1 in skills]
result.append([skills, scores])
return result
pprint.pprint(refactor(agilityskills))
显示的结果是:
[[['Archery', 'Crossbow', 'Bow'], [4, 6, 6]],
[['Pistols', 'Holdouts', 'Semi-Automatics'], [6, 8, 8]],
[['Gymnastics', 'Balancing'], [6, 8]],
[['Blades'], [5]]]
,它给出了所需分组和相应顺序中的技能名称和分数,但尚未格式化为每个子列表的单个字符串。请注意,子列表的顺序无法保证 - 它发生在" work"根据需要,这是随机的,因为一般来说dict
无法保持秩序(我确实注意到它发生了一次"交换" Pistols
子技能之间 - - 如果您运行此代码,您可能会看到其他代码。)
如果订单很重要,则需要单独记录(collections.OrderedDict
有时可以提供帮助,但在很多情况下我也看到它对编码器感到惊讶 - 所以让我们转移那到另一个未来的问题,如果需要: - )。
无论如何,还有一些格式化。条目的所需输出字符串如下:
Archery(Bow)(Crossbow) >--------------------------------> 4(6)
(困难的部分只有正确数量的短划线,我将传递那个一个! - )。
因此,考虑到上面refactor
生成的嵌套列表,我们可以轻松地 格式化<:>
def withparens(ss):
fss = [str(ss[0])]
for s1 in ss[1:]:
fss.append('({})'.format(s1))
return ''.join(fss)
def formatit(rf, numdashes=6):
result = []
for skills, scores in rf:
result.append('{} >{}> {}'.format(
withparens(skills),
'-' * numdashes,
withparens(scores)))
return result
result = formatit(refactor(agilityskills))
for line in result:
print(line)
现在,这显示:
Archery(Crossbow)(Bow) >------> 4(6)(6)
Pistols(Holdouts)(Semi-Automatics) >------> 6(8)(8)
Gymnastics(Balancing) >------> 6(8)
Blades >------> 5
... 几乎所需的结果,除了固定为六(或任何其他单个任意值)的破折号数明显产生难看的结果。相反,对于由formatit
生成的每一行,短划线的数量应该不同,以便得到良好的对齐。但是这样做一般很难,从那里我的撑船: - )。
尽管如此,我们可以通过考虑>
&#34;的行开头的长度来做得更好 。这似乎是OP的问题集中在均衡上。所以...:
def formatitbetter(rf):
result = []
for skills, scores in rf:
fsk = withparens(skills)
numdashes = 53 - len(fsk)
result.append('{} >{}> {}'.format(
fsk,
'-' * numdashes,
withparens(scores)))
return result
result = formatitbetter(refactor(agilityskills))
for line in result:
print(line)
现在,运行它会显示OP所要求的结果(如果我已经计算了正确的破折号数,那么,调整该魔术常数53
来品尝: - )...
Archery(Crossbow)(Bow) >-------------------------------> 4(6)(6)
Pistols(Holdouts)(Semi-Automatics) >-------------------> 6(8)(8)
Gymnastics(Balancing) >--------------------------------> 6(8)
Blades >-----------------------------------------------> 5
当然,问题在于,如果某些技能具有许多具有长名称的子技能,这将不会为破折号留下足够的空间;如果我们让线条更长,有些可能会太长&#34;无论出于何种目的,OP都想到了这个&#34;漂亮的展示&#34;首先。它在演示部分实现了通用性,使得演示问题完全具有普遍性,是一个难题! - )
(现在大多数演示文稿将使用不是单倍间距的字体,使事情变得更加困难,因为&#34;视觉&#34;文本字符串的长度不仅仅是字符数/该文字中的字形,但取决于字体的度量......足以让几个头痛,特别是像我这样的人,因为我是高度语言,非 - 视觉,思想家! - )