我有一个复杂的Dictionary来组织输出,但需要将它传递给另一个模块

时间:2015-01-28 05:25:11

标签: python function loops variables dictionary

首先,我是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

我不想打印这个,但是把它传递给另一个模块,所以也许将结果用作函数或变量?

1 个答案:

答案 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;文本字符串的长度不仅仅是字符数/该文字中的字形,但取决于字体的度量......足以让几个头痛,特别是像我这样的人,因为我是高度语言, - 视觉,思想家! - )