【问题标题】:Python; Dictionary iterationPython;字典迭代
【发布时间】:2013-12-03 13:19:08
【问题描述】:
z = []
for k, v in b.iteritems():
    if v == "Supplementary Assignment, Smith, Bowen":
        z.append(not k)

您好,我正在尝试遍历字典中的值。这里的目标是z.append() 'b' 中的所有键,它们不包含在if 语句中为v 定义的多个值。因此,如果 dict 'b' 包含一个值为 'Smith' 的键/值对,则该键将从 z.append() 调用中排除,而所有其他键将被附加。感谢您的帮助!

【问题讨论】:

    标签: python list for-loop dictionary iteration


    【解决方案1】:

    您需要使用成员资格测试 (not in) 针对序列或集合进行测试:

    z = []
    for k, v in b.iteritems():
        if v not in {"Supplementary", "Assignment", "Smith", "Bowen"}:
            z.append(k)
    

    或者,在列表理解中更紧凑:

    z = [key for key, value in b.iteritems() if value not in {"Supplementary", "Assignment", "Smith", "Bowen"}]
    

    这会列出b 中所有值未在集合中列出的键。

    如果循环效率最重要,并且您使用的是 Python 版本 3.3,则首先将集合存储在局部变量中并在循环中使用它:

    z = []
    excluded = {"Supplementary", "Assignment", "Smith", "Bowen"}
    for k, v in b.iteritems():
        if v not in excluded:
            z.append(k)
    

    或列表comp版本:

    excluded = {"Supplementary", "Assignment", "Smith", "Bowen"}
    z = [key for key, value in b.iteritems() if value not in excluded]
    

    Python 3.3 识别 in {...}not in {...} 语法(带有集合)并优化代码以使用本地 frozenset() 常量作为集合文字。

    【讨论】:

    • 好的,谢谢 Martijn。我知道我很接近,但不知道not in 关键字。太好了,再次感谢!
    • 可能是错的...但是将这个{"Supplementary", "Assignment", "Smith", "Bowen"} 放在一个变量中,这样您就不会在列表comp 中多次重新创建它不是更好吗?
    • @iCodez:是一个常数;加载它相当快。在 Python 3.3 及更高版本中,它将使 set 成为常量,在之前的版本中,它会将字符串作为常量加载并在每次循环迭代时执行 BUILD_SET。加载常量与加载本地变量一样快。
    • @iCodez:我现在开始默认使用 Python 3.3,除非我看到 Python 早期版本的证据。
    • 我最初对{'Supplementary', ...} 语法感到惊讶。那不应该是一个列表或元组吗?这样不是语法错误吗?只有在尝试之后,我才注意到这实际上是用于编写集合的有效 python。我不知道他们添加了它。 (在 python 2.7 中,现在我已经用谷歌搜索了它)。你每天都会学到一些东西:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 2021-07-24
    • 2018-04-06
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多