全面的 `for...in` 不同于标准循环

Comprehensive `for...in` different from standard loops

我们得到以下两个随机数列表:

import numpy as np
import random 

random.seed(1)
first  = random.sample(xrange(10), 5)

random.seed(2)
second = random.sample(xrange(10), 5)

print("first ="), first
print("second ="), second
-------------------------

first = [1, 7, 6, 9, 2]
second = [9, 8, 0, 7, 5]

其中我们要使用逐行标准比较来找到交集作为

loop = []

for first_element in first:
   for second_element in second:
       if first_element ==  second_element:
          loop.append(first_element)

print loop 
----------
[7, 9]

我想通过

条件下的综合作业使它更像 Pythonic
comprehension = [[first_element for second_element in second if
                first_element == second_element] for first_element 
                in first]

print comprehension
-------------------
[[], [7], [], [9], []]

两个结果不同(最后一个也显示不匹配的结果),所以我猜这两个作业是有区别的。前者(使用标准 for...for...if)正是我想要的,但我更喜欢后一种方法,因为我有更多的方法并且我想避免一直编写内部循环。

第二个结果不同,因为您定义了另一个偶尔为空的列表。

comprehension = [
    [first_element for second_element in second
     if first_element == second_element]  # a list with some number
                                          # of first_elements in it
     for first_element in first]  # the outer list

相反,您应该只使用平面列表理解并在末尾添加过滤器。

result = [first_el for first_el in first 
          for second_el in second if first_el == second_el]

这可能更简单

result = [first_el for first_el in first if first_el in second]

除了 first_elsecond 中出现不止一次的极端情况。如果可以忽略这种极端情况,那么最好的方法是:

result = set(first).intersection(second)

对于计算交集、并集等,sets 是最佳选择:

>>> list(set(first) & set(second))
[9, 7]