来自字典的条件列表与使用条件搜索字典 - Python

Conditional list from a dictionary vs. Searching a dictionary with a condition - Python

我有字典:

d = {'red':1,'green':2,'blue':3}

我可以使用以下语法从该词典中创建与条件匹配的键列表:

mylist = [k for k in d if d[k] > 1]
print mylist

>>>> ['blue', 'green']

但是,如果我尝试使用类似的代码行搜索具有条件的字典,这将不起作用:

for k in d if d[k] > 1:
    print k, d[k]

>>>>for k in d if d[k] > 1:
                          ^
SyntaxError: invalid syntax

任何人都可以向我解释为什么不是这样吗?或者如果我做错了什么?好像如果允许我在列表时将查字典和条件语句结合起来,那么在不列表的情况下查字典时也应该被允许这样做。

我在 Python 2.7.8

工作

而不是:

for k in d if d[k] > 1:
    print k, d[k]

你应该简单地写:

for k in d:
    if d[k] > 1:
        print k, d[k]

将所有内容放在一行 [k for k in d if d[k] > 1] 中的列表理解语法只是上述内容的语法糖。

编辑: 尽管正如我在下面的评论中提到的,您可以使用生成器推导式做一些棘手的事情。生成器推导式(以防后来阅读此答案的人不知道)类似于列表推导式,但它会生成一个 generator,一个可迭代的对象,您可以将其插入 for循环(或坚持一个变量供以后处理)。所以你可以这样做:

g = (k for k in d if d[k] > 1)

以后,

for k in g:
    print k, d[k]

或者,合并成一个操作(虽然这样有点难看):

for k in (x for x in d if d[x] > 1):
    print k, d[k]

请注意,生成器理解中的 x 也可能是 k,但我选择使用不同的名称,这样会更清楚发生了什么。名称 x 在理解范围之外 不是 ,顺便说一句:

for k in (x for x in d if d[x] > 1):
    print k, d[k], x

产生:

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
NameError: name 'x' is not defined

正如我所说,这有点难看,因为您最终不得不编写两次 for 语句。 (一次用于 "what the generator does" 代码,一次用于 "I want to unroll the generator and get its results" 代码)。但它是最接近您正在寻找的 "I want to do this in one line" 语法的。

第一种情况是列表理解。 第二种情况没什么。

我同意@rmunn。但是,如果您坚持使用一行,那么这将起作用:

d = {'red':1,'green':2,'blue':3}
for k, v in ((k, v) for (k, v) in d.items() if v > 1):
    print k, v

它只进行一次字典查找。如果您选择@rmunn 提供的解决方案,那么我会将字典查找减少到一个。

for k, v in d.items():
    if v > 1:
        print k, v

正如@rmunn 在评论中指出的那样,在 Python 2 中使用惰性 iteritems() 更好,其中 returns 是一个迭代器:

for k, v in d.iteritems():
    if v > 1:
        print k, v