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。如果您使用 setnzcmovnz,宏融合不会是一个因素,所以 ptest 将是收支平衡。正如我上面提到的,ptest 的主要用例是您可以在没有比较指令和 AVX 的情况下使用它。

检查向量是否为全零的替代方法 (pcmpeqb xmm0,xmm1 / pmovmskb eax, xmm1 / test eax,eax) 必须在没有 AVX 的情况下销毁其中一个输入向量,因此如果出现这种情况,则需要额外的 movdqa 指令来复制测试后你仍然需要两者。


ptest浮点位黑客

我认为对于这个特定的测试,可以跳过比较指令并直接使用vptest 来查看是否有任何float 元素的符号位未设置,但在其他地方一些非零位。

实际上不,这个想法行不通,因为它不尊重元素边界。它无法区分具有正元素的向量与具有+0.0 元素(符号位清除)和另一个负元素(设置其他位)的向量之间的区别。

vptest 设置CF=bool(~src1 &amp; src2) and ZF=(src1 &amp; src2)。我在想 src1=set1(0x7FFFFFFF) 可以告诉我们一些关于符号位和非符号位的有用信息,我们可以使用检查 CF 和 ZF 的条件进行测试。例如ja:CF=0 和 ZF=0。实际上,没有 x86 条件仅适用于 CF=1 ZF=0,但这是另一个问题。

NaN &gt; 0 也是错误的,但 NaN 有一些设置位。 (指数全1,尾数非零,符号位=不关心,因此可以有+NaN和-NaN)。如果这是唯一的问题,这在不需要 NaN 处理的情况下仍然有用。

【讨论】:

以上是关于Python 想让一个list里面所有大于零的数字组成新list怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

为啥是一个数字,例如2% 一个大于零的空集是真的吗? [复制]

Laravel:验证大于零的数字失败

如何在sqlite中获得列大于零的所有结果?

怎样用jquery实现输入框只能输入大于零的数字? 两个输入框一个是宽度,一个是高度

查找关联计数大于零的所有记录

格式化包含带前导零的小数点的数字