综合`for ... in`与标准循环不同

时间:2015-10-10 22:57:41

标签: python for-loop list-comprehension

我们给出了以下两个随机数字列表:

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)正是我想要的,但我想要后一种方法,因为我有更多的它们,我想避免一直写内部循环。

2 个答案:

答案 0 :(得分:2)

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

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)

答案 1 :(得分:1)

为计算交叉点,工会等,set是最佳选择:

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