多字典 - 将字典的键转换为数字

时间:2013-11-06 03:25:51

标签: python file-io dictionary

我有以下多字典从文件输出,在我的脚本中,它作为标准输入:

{ 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

我哪里错了。

1 个答案:

答案 0 :(得分: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