-2

创建了一个简单的字典:

 procinfos = {"f1": f1, "f2": f2, "f3shell" : (wrap_for_process, q, f3shell, "input arg1", "input arg2")}

然后我想打印它的内容:

 print (procinfo for procinfo in procinfos)

<generator object <genexpr> at 0x7f46dccc0dc0>

为什么 python 只告诉我这是一个生成器?我怎样才能简单地打印内容。从我读过的关于生成器的内容来看,它们不打算使用字典/列表。但这已经是一个完全具体化的集合——不简单地打印它是没有意义的(至少对我来说......)。这是一个常见的用例,希望能以简洁的方式获得这些集合的基本打印。谢谢。

更新:我希望它在单行/内联中,而不是多行。谢谢。

4

4 回答 4

5

您正在打印一个生成器。

procinfo for procinfo in procinfos

是一个生成器表达式。它只会在迭代时被评估。您可以这样做,例如将其传递给列表构造函数:

list(procinfo for procinfo in procinfos)

但是你可以得到相同的结果(注1):

list(procinfos.keys())

或者在 Python 2 中:

procinfos.keys()

所以最有可能的是,做你想做的事:

print procinfos.keys()

如果你想在每一行打印一个,你可以这样做:

print '\n'.join(procinfos)

注意 1:实际上只是list(procinfos)可以工作,就像 '\n'.join(procinfos) 但为什么它会工作不太明显,但这是因为迭代字典将迭代它的键。这是一个更高级的 Python,所以现在不用担心。:-)

于 2013-05-14T22:37:25.640 回答
2

因为您将生成器表达式传递给print. print尝试将非字符串参数转换为字符串,但生成器没有一个很好的、人类可读的strrepr定义,因为它们在被使用(由迭代器)之前不会被评估,所以你会得到<generator object...>结果。你需要:

for procinfo in procinfos:
    print(procinfo)

对于内联解决方案,它取决于您正在寻找的格式,但我会选择这样的东西:

print('\n'.join(procinfos))

当然,这(和您的原始代码)仅打印来自procinfos. 如果你想要键:值对,你可以这样做:

print('\n'.join('{}: {}'.format(k, v) for k, v in procinfos.items()))

当然,我假设您需要换行符或其他格式,因为如果您只想将整个字典打印在一行上,print procinfos那么您只需要。

于 2013-05-14T22:33:59.823 回答
2

只需使用括号代替:

print [procinfo for procinfo in procinfos]
于 2013-05-14T22:36:47.643 回答
0

正如其他答案所说,如果您明确给出print生成器表达式,它将打印一个生成器。

如果你想让它打印一个列表,你必须(a)从中制作一个列表,或者(b)首先将一个列表传递给它(例如,通过使用列表推导而不是生成器表达式):

print list(procinfo for procinfo in procinfos)
print [procinfo for procinfo in procinfos]

正如 Lennart Regebro 指出的那样,如果您只想打印 dict 的键,您甚至不需要 genexp 或 listcomp,因为该keys方法返回一个列表(在 Python 2 中)或您可以传递给的迭代器list(在 Python 中) 3):

print procinfos.keys()

或者,就此而言(2.x 和 3.x):

print list(procinfos)

如果你想“打印”字典的内容,大概意思是键和值……只需打印字典:

print procinfos

然而,解决这个问题的最好方法是不要依赖print做任何魔术,而是希望__str__使用一些足够好的格式。相反,决定希望如何将输出转换为字符串,然后执行此操作。例如:

print ' '.join(procinfo for procinfo in procinfos)

但当然,以上所有要点在这里仍然适用:

print ' '.join(procinfo)
print ' '.join(procinfo.items())
# ...
于 2013-05-14T22:43:26.627 回答