从列表中返回满足另一个列表条件的元素,然后与第四个列表python进行比较

时间:2017-07-23 14:28:36

标签: python list

我有两个清单:

listA = [230, 232, 230, 229, 237, 212, 245, 233, 220, 230]
listB = [232, 231, 234, 230, 234, 228, 244, 236, 227, 229]

如何比较列表并仅将listA大于listB的点返回到第三个列表listC,同时保留索引以使结果如下所示:< / p>

listC = [   , 232,    ,    , 237,    , 245,    ,    , 230]

毕竟,还有第四个列表listD

listD = [1,2,3,4,5,6,7,8,9,10]

并且我正在尝试将其与listC进行整理,以便最终得到列表C&amp; D在指数方面匹配:

最终结果:

listD = [ 2 , 5 , 7 , 10]
listC = [233,237,245,230]

我正在研究列表理解,因为我被告知它会有所帮助,但我不确定如何应用我所读过的内容。

3 个答案:

答案 0 :(得分:3)

这是itertools.compress的完美用例:

>>> from itertools import compress, starmap
>>> from operator import gt

获取一个新的布尔值列表,其中True表示listA中的项目大于listB中的相应项目。

>>> bools = list(starmap(gt, zip(listA, listB)))
>>> bools
[False, True, False, False, True, False, True, False, False, True]

现在,我们使用listA根据listD过滤boolscompress

>>> list(compress(listA, bools))
[232, 237, 245, 230]
>>> list(compress(listD, bools))
[2, 5, 7, 10]

答案 1 :(得分:1)

我不会在这里使用列表理解;您正在构建两个列表,而不是一个,并且使用常规for循环更容易:

listC = []
listD_filtered = []
for a, b, d in zip(listA, listB, listD):
    if a > b:
        listC.append(a)
        listD_filtered.append(d)

使用zip()您可以并行迭代列表,无需完全跟踪索引。

您仍然可以在此处使用理解,但随后您将使用(a, d)值构建序列,然后再次使用zip()将该结果拆分为两个单独的列表:

listC, listD = zip(*((a, d) for a, b, d in zip(listA, listB, listD) if a > b))

然而,这更难以理解和解释,在这种情况下你实际上有元组,而不是列表(取决于你的用例,你必须再将它们转换为列表)。

演示:

>>> listA = [230, 232, 230, 229, 237, 212, 245, 233, 220, 230]
>>> listB = [232, 231, 234, 230, 234, 228, 244, 236, 227, 229]
>>> listD = [1,2,3,4,5,6,7,8,9,10]
>>> listC = []
>>> listD_filtered = []
>>> for a, b, d in zip(listA, listB, listD):
...     if a > b:
...         listC.append(a)
...         listD_filtered.append(d)
...
>>> listC
[232, 237, 245, 230]
>>> listD_filtered
[2, 5, 7, 10]
>>>
>>> listC, listD = zip(*((a, d) for a, b, d in zip(listA, listB, listD) if a > b))
>>> listC
(232, 237, 245, 230)
>>> listD
(2, 5, 7, 10)

答案 2 :(得分:1)

通过列表理解获得结果:

In [6]: listC = [i for i, j in zip(listA, listB) if i>j]                                                                                                                                            
In [7]: listC                                                                                     
Out[7]: [232, 237, 245, 230]

In [9]: listD = [i for i, (a, b) in enumerate(zip(listA, listB), 1) if a>b]                                                                                                                         
In [10]: listD                                                                                    
Out[10]: [2, 5, 7, 10]