从dict.items()捕获值

时间:2019-01-09 18:00:32

标签: python

最近,我从一本python书中遇到了这段list comprehension代码:

['%s="%s"' % item for item in attrs.items()]

在传递'attrs = {'size':'large', 'quantity':6}时会产生['size="large"', 'quantity="6"']作为输出。但是我对于哪个变量捕获键,哪个变量捕获值感到困惑。

我了解到attrs.items()将产生包含2-tupleskeys的{​​{1}},但是只有一个变量(values)可以捕获它,那怎么运作的呢?有人可以分开说明在这里发生了什么魔术吗?这更加复杂,因为这里同时还存在一些字符串格式。

3 个答案:

答案 0 :(得分:3)

print "%s %s %s %s" % ("It","works","like","this")

输出:

It works like this

但是您可能应该在2.7+上切换到str.format()语法:

以及在Python 3.6+中的f-strings

您可能还想访问https://pyformat.info/,以获取关于如何正确设置格式的信息。

答案 1 :(得分:3)

item是一个由键值组成的元组:

>>> for item in attrs.item():
...  print item
('size', 'large')
('quantity', 6)

由于item是一个元组,它可以直接用作%的右侧参数,并且其元素按格式字符串顺序使用。

>>> "%s=%s" % item  # equivalent to "%s=%s" % ('size', 'large'), for example
"size=large"

(这就是为什么如果您不确定参数不是元组,建议始终对%使用 expitit 元组的原因。例如,如果foo=('a', 'b'),则"%s" % foo会产生错误,但是"%s" % (foo,)会产生"('a', 'b')",这可能是预期的。)

答案 2 :(得分:1)

items()返回key, value的元组,然后该元组作为参数传递给%运算符,因此它被用来替换字符串中的占位符。