我有两个清单:
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]
我正在研究列表理解,因为我被告知它会有所帮助,但我不确定如何应用我所读过的内容。
答案 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
过滤bools
和compress
。
>>> 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]