Python 想让一个list里面所有大于零的数字组成新list怎么办?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 想让一个list里面所有大于零的数字组成新list怎么办?相关的知识,希望对你有一定的参考价值。
lista=[1,3,5,-1,-2,9]listb=[]
i=len(lista)-1
while i>=0:
if lista[i]>0:
listb.append(list[i])
del lista[i]
i+=1
这样就可以了。
也可以减化一下
listb=[a for a in lista if a>0]
lista=[a for a in lista if a<=0]
这样就更简单了。 参考技术A 直接:
new_list = [i for i in old_list if i > 0]本回答被提问者和网友采纳 参考技术B a=[1,2,0,4,5]
b=[]
for i in range(len(a)):
c=int(a[i])
if c>0:
b.append(c)
检查向量是不是包含任何大于零的元素
【中文标题】检查向量是不是包含任何大于零的元素【英文标题】:Checking If A Vector Contains Any Element Greater Than Zero检查向量是否包含任何大于零的元素 【发布时间】:2014-10-20 20:30:35 【问题描述】:如果有人可以帮助编写一个接收 AVX 向量并检查它是否包含任何大于零的元素的函数,我将不胜感激..
我已经编写了以下代码,但它不是最佳的,因为它存储元素然后对其进行操作.. 应该将向量作为一个整体进行检查。
int check(__m256 vector)
float * temp;
posix_memalign ((void **) &temp, 32, 8 * sizeof(float));
_mm256_store_ps( temp, vector );
int flag=0;
for(int k=0; k<8; k++)
flag= ( (temp[k]>0) ? 1 : 0 );
if (flag==1) return 1;
free( temp);
return 0;
【问题讨论】:
有一份名为英特尔软件开发人员手册的文档,您应该获取它。当您查看它时,您将在 B 卷第 3 章中看到所有指令的列表以及您可以为每个指令使用的内在函数。这里要__m256 vcmp = _mm256_cmp_ps(_mm256_setzero_ps(), x, _CMP_LT_OQ)
,后面要int cmp = _mm256_movemask_ps(vcmp)
,把比较结果挑出来打包在一起。如果cmp = 0xFF
,则满足你的条件。
@IwillnotexistIdonotexist - 我认为这将是一个非常相关的答案。
@ryyker 我想是这样,但我可以发誓已经有人问过并正在寻找它的变体。我记得在遥远的过去,它的 SSE 变体,但也许它正在检查等于 0。
@MROF 我刚刚意识到 w.r.t.我在上面的评论中,查找 any 元素是否 >0 的正确比较是 cmp != 0
,而不是 cmp == 0xFF
,它查找 all 元素是否 >0。
它正在工作 ^_^ 非常感谢您的合作。
【参考方案1】:
如果您要对结果进行分支,通常使用“传统”比较/移动掩码/整数测试的微指令更少,就像使用 SSE1 一样。
__m256 vcmp = _mm256_cmp_ps(_mm256_setzero_ps(), x, _CMP_LT_OQ);
int cmp = _mm256_movemask_ps(vcmp);
if (cmp)
return 1;
这通常编译成类似的东西
vcmplt_oqps ymm2, ymm0, ymm1
vpmovmskb eax, ymm2
test eax,eax
jnz .true_branch
这些都是单 uop 指令,并且 test/jnz 宏熔断在支持 AVX 的 Intel 和 AMD CPU 上,所以总共只有 3 个 uops(在 Intel 上)。
请参阅Agner Fog's instruction tables + microarch guide,以及从https://***.com/tags/x86/info 链接的其他指南。
您也可以使用 PTEST,但在这种情况下效率较低。见_mm_testc_ps and _mm_testc_pd vs _mm_testc_si128
如果没有 AVX,ptest
可以方便地检查寄存器是否全为零,而不需要额外的指令来复制它(因为它直接设置整数标志)。但是由于它是 2 uops,并且不能与 jcc
分支指令进行宏融合,实际上它比上面的更糟糕:
// don't use, sub-optimal
__m256 vcmp = _mm256_cmp_ps(_mm256_setzero_ps(), x, _CMP_LT_OQ);
if (!_mm256_testz_si256(vcmp, vcmp))
return 1;
testz
内在函数是 PTEST
。它直接根据其参数的 AND 和 AND NOT 结果设置 ZF 和 CF 标志。当vcmp
有任何非零位时,testz 内在函数为真。 (只有在vcmpps
放一些东西时才会这样做。)
VPTEST
with ymm regs 仅适用于 AVX。 AVX2 不是必需的,即使它看起来像一个向量整数指令。
这将编译成类似的东西
vcmplt_oqps ymm2, ymm0, ymm1
vptest ymm2, ymm2
jnz .true_branch
可能比上面的代码大小更小,但这实际上是 4 微指令而不是 3。如果您使用 setnz
或 cmovnz
,宏融合不会是一个因素,所以 ptest
将是收支平衡。正如我上面提到的,ptest
的主要用例是您可以在没有比较指令和 AVX 的情况下使用它。
检查向量是否为全零的替代方法 (pcmpeqb xmm0,xmm1
/ pmovmskb eax, xmm1
/ test eax,eax
) 必须在没有 AVX 的情况下销毁其中一个输入向量,因此如果出现这种情况,则需要额外的 movdqa
指令来复制测试后你仍然需要两者。
ptest
浮点位黑客
我认为对于这个特定的测试,可以跳过比较指令并直接使用vptest
来查看是否有任何float
元素的符号位未设置,但在其他地方一些非零位。
实际上不,这个想法行不通,因为它不尊重元素边界。它无法区分具有正元素的向量与具有+0.0
元素(符号位清除)和另一个负元素(设置其他位)的向量之间的区别。
vptest
设置CF=bool(~src1 & src2)
and ZF=(src1 & src2)
。我在想 src1=set1(0x7FFFFFFF)
可以告诉我们一些关于符号位和非符号位的有用信息,我们可以使用检查 CF 和 ZF 的条件进行测试。例如ja
:CF=0 和 ZF=0。实际上,没有 x86 条件仅适用于 CF=1 和 ZF=0,但这是另一个问题。
NaN > 0
也是错误的,但 NaN 有一些设置位。 (指数全1,尾数非零,符号位=不关心,因此可以有+NaN和-NaN)。如果这是唯一的问题,这在不需要 NaN 处理的情况下仍然有用。
【讨论】:
以上是关于Python 想让一个list里面所有大于零的数字组成新list怎么办?的主要内容,如果未能解决你的问题,请参考以下文章
为啥是一个数字,例如2% 一个大于零的空集是真的吗? [复制]