0

我有以下多字典,它从文件和脚本中获取输出,将其作为标准输入:

{ 345 : {'name': 5, 'count': 6, 'top': 0} }
{ 233 : {'name': 6, 'count': 4, 'top': 0} }
{ 123 : {'name': 2, 'count': 9, 'top': 1} }

我想将字典的所有键转换为这样的数字:

{ 1 : {'1': 5, '2': 6, '3': 0} }
{ 2 : {'1': 6, '2': 4, '3': 0} }
{ 3 : {'1': 2, '2': 9, '3': 1} }

文件的输出应该是:

 1 1: 5 2: 6 3: 0
 2 1: 6 2: 4 3: 0
 3 1: 2 2: 9 3: 1

我正在尝试理解字典和 python 的新手,所以想知道如何实现它。
这是我的代码

for line in sys.stdin:
    d = ast.literal_eval(line)
    for k,v in d.items():
       inner_dict = dicts.setdefault(k, {})
       inner_dict= dict((t,i) for (t,i) in enumerate(sorted(dicts.keys())))

for key, value in inner_dict.items():
   print key, value

上面的代码给了我以下输出,但没有给我想要的。

0 123
1 233
2 345

我哪里错了。

4

1 回答 1

4

生成示例中指定的字典:

# generate individual converted dictionaries 
# not tested with sys.stdin
def gen_with_appropriate_name():
    for n, line in enumerate(sys.stdin, 1):
        d = ast.literal_eval(line)
        sub_d = d.values()[0]
        yield {n : {'1' : sub_d['name'],
                     '2' : sub_d['count'],
                     '3' : sub_d['top']}}

以下将产生与基于其原始键的子字典的枚举类似的结果,排序。

# generate individual converted dictionaries 
# not tested with sys.stdin
def gen_with_appropriate_name():
    for n, line in enumerate(sys.stdin, 1):
        d = ast.literal_eval(line)
        items = d.values()[0].items()
        items.sort(key = lambda itm: itm[0])
        yield {n: {i+1:item[1] for i, item in enumerate(items)}} 

用法 - 以指定格式打印输出

d = gen_with_appropriate_name()
for thing in d:
    first =  str(thing.keys()[0])
    second =  thing.values()[0]
    print first + ' ' + ' '.join('{}: {}'.format(*item) for item in second.iteritems())

使用第一个函数输出:

1 1: 5 3: 0 2: 6
2 1: 6 3: 0 2: 4
3 1: 2 3: 1 2: 9

使用第二个函数输出

1 1: 6 2: 5 3: 0
2 1: 4 2: 6 3: 0
3 1: 9 2: 2 3: 1

解释:

gen_with appropriate_name()

此函数一次从 sys.stdin 获取数据,并依次为每一生成一个字典。它是可迭代的。 http://docs.python.org/2.7/glossary.html#term-iterable

yield {n: {i+1:item[1] for i, item in enumerate(items)}}

yield 语句使函数成为生成器。该函数在 yield 语句处暂停,直到调用 next(),然后继续执行,直到遇到另一个 yield 语句。生成器的 next() 方法返回 yield 语句的表达式列表的值。 http://docs.python.org/2.7/reference/expressions.html#yieldexpr

{n: {i+1:item[1] for i, item in enumerate(items)}}

这是 yield 语句的表达式列表。它创建一个以 n 为键的字典。该值是使用类似于列表推导式的字典显示创建的字典。http://docs.python.org/2.7/reference/expressions.html#displays-for-sets-and-dic‌​tionaries

于 2013-11-06T04:27:21.980 回答