我目前正在查看 Think Python 中使用setdefault方法实现倒置字典的代码片段,我不清楚其工作原理:
def invert_dict(d):
"""Inverts a dictionary, returning a map from val to a list of keys.
If the mapping key->val appears in d, then in the new dictionary
val maps to a list that includes key.
d: dict
Returns: dict
"""
inverse = {}
for key, val in d.iteritems():
inverse.setdefault(val, []).append(key)
return inverse
在for循环中从左到右阅读,inverse.setdefault(val, [])
在字典中创建一个条目,而不是列表。那么我们如何使用append方法?
答案 0 :(得分:1)
您可以使用append方法,因为setdefault本身在必要时初始化之后返回dict [val]的值。因此,第一次在特定字典键上调用setdefault时,它会将inverse [val]设置为第二个参数(空列表),然后返回该空列表。这是您要附加的列表。
对于这个特定的用例,这个特殊的范例是过时的,顺便说一下。现在最好的方法是:
$pattern = '/['.unichr(0x1F300).'-'.unichr(0x1F5FF).
unichr(0xE000).'-'.unichr(0xF8FF).']/u';
if (preg_match($pattern, $_POST['username'])) {
原因是setdefault每次通过列表都会创建一个新的空列表对象,如果inverse [val]已经存在,则会立即丢弃新创建的对象。
此外,iteritems()对于Python 2来说仍然更有效,但它在Python 3中并不存在,而Python 3中的items()与Python 2中的iteritems()的工作方式相同。