在python 3中,从包含异构数据类型项的列表中仅获取正数 我有一个包含在字符串中的异构数据类型的项目列表。

在python 3中,从包含异构数据类型项的列表中仅获取正数 我有一个包含在字符串中的异构数据类型的项目列表。,python,list,Python,List,由此,我想获得一个只有正数的新列表:new\u lst=[1155] 我试图避免负数,如下所示。但是,我无法避免字符串和空字符串: lst1=int(lst) for i in lst1: if i<0: print i else: continue Traceback (most recent call last): File "C:/Users/Dev/Documents/Assignment-2/test-2.py", line 22, in &

由此,我想获得一个只有正数的新列表:
new\u lst=[1155]

我试图避免负数,如下所示。但是,我无法避免字符串和空字符串:

lst1=int(lst)
for i in lst1:
    if i<0:
    print i
    else:
    continue

Traceback (most recent call last):
  File "C:/Users/Dev/Documents/Assignment-2/test-2.py", line 22, in <module>
    c3=int(row[3])
ValueError: invalid literal for int() with base 10: 'err'
>>> 
lst1=int(lst)
对于lst1中的i:
如果我>>
lst1=int(lst)
是引发异常的代码。这实际上是试图将
列表
转换为
int
(这是您无法做到的)

您要做的是遍历
lst
,对于每个元素,确定元素是否可以转换为
int
,然后检查元素(作为
int
)是否为正


你可以这样做:

lst = ['1','err','-1',' ','155']
new_lst = []

for i in lst:
    try:
        int_i = int(i)           # try to cast i to an int
        if int_i > 0:
            new_lst.append(int_i)
    except ValueError:           # ValueError is raised, i cannot be cast into an int
        pass                     # continue to the next element


编辑:添加了
ValueError
完整性,请参见@BigZ的答案。

这里有一个单行程序,用于测试元素是否实际上是一个数字。如果未完成此检查,
int(x)
将不起作用,并引发异常

lst=['1','err','-1',' ','155']
newlst = []
for i in lst:
    try:
        if int(i) >= 0:
            newlst.append(int(i))
    except ValueError:
        pass
lst=['1','err','-1',' ','155']
lst1 = filter(None,[(lambda x: x if x.isdigit() and int(x) > 0 else None) (x) for x in lst])

如果您只有整数,并且只想保留正数,则只要考虑
str.isdigit
就足够了,因为您不关心
“-1”
str.isdigit
上是否失败:

lst[:] = (ele for ele in lst if ele.isdigit() and int(ele) > 0)

如果您可能有浮动,那么使用
int
和try/except的所有答案也将失败,如果您想涵盖“1.0”等内容。。您需要在try中强制转换为float。

您可以利用
pd.\u numeric
和参数
强制
通过将非数字更改为Nan,从本质上删除它们,然后只提取正数

[x for x in  pd.to_numeric(lst, errors='coerce') if x > 0]

这听起来像是家庭作业,所以我不会给你工作代码,我会给你一个如何解决它的想法。首先,迭代列表,对于列表中的每个项目,
尝试将其转换为
int
。如果转换成功,请检查数字是否大于0。如果是这样,那么您可以将其添加到正数列表中。
[x for x in  pd.to_numeric(lst, errors='coerce') if x > 0]