生成示例中指定的字典:
# 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-dictionaries