如何从列表中删除所有非浮点数和重复项

3

我有这样的列表:

setter_maping = ['14.99', '0.0', '226.95', '0.0', '14.99', 'None', '0.0']

我该如何获得这样的列表(删除所有重复项、零、空值等,总之:删除所有不是浮点数的内容,例如22.22或15.66等。如果列表中有0.0或任何不符合数字.数字模式(11.1,11.11)的内容,应予以删除):
result = ['14.99', '226.95']

我已经完成了简单的操作:

kick_off = ['None', '0.0']
[mapped_prices.remove(i) for i in set_map if i in kick_off]

但是如何生成更统一的模式来删除错误值呢? 正则表达式能为我提供解决方案吗?哪个正则表达式可以解决这个问题?我对这个模块没有经验。


万事开头难。请前往regular-expressions.info并阅读教程。 - Barmar
要从列表中删除重复项,您应该考虑使用 set - MrAlias
@MrAlias:['19.2','19.200']怎么办? - President James K. Polk
@GregS 那是一个很好的观点。我并不是说仅靠一个集合就能解决问题。 - MrAlias
@Barmar 谢谢你提供的链接! - smith
显示剩余2条评论
4个回答

4
这适用于任何非浮点值,不仅限于None'None',而且还会保留原始顺序:
set_map = ['17.99', '0.0', '26.95', '26.95', '17.99', 'None', '0.0']
seen = {0}
new_map = []
for item in set_map:
     try:
         flitem = float(item)
     except ValueError:
         continue
     if flitem not in seen:
         seen.add(flitem)
         new_map.append(item)

print(new_map)

此外,诸如“0”或“0.000000”之类的字符串将无法进入新列表。

智能解决方案 @timgeb,我忘了说我需要始终有两个项目在结果中,但你的变体很好用。 - smith
这正是按照原帖所述的做法,我想请解释一下为什么要点踩,谢谢。 - timgeb
这个问题很简单,但代码有点长。为什么要用11行更复杂的代码,而不是只用4行呢?此外,这并没有解决OP的问题。他要求输出字符串,你却给了他浮点数。 - Eli
1
@Eli,感谢你指出期望结果中有字符串,我忽略了这一点。我已经相应地调整了我的代码。此外,如果原始顺序不需要保留,那么你使用集合的解决方案更好,但我认为应该保留原始顺序。我还假设原始列表中可能有可变对象,因此当您尝试将其转换为集合时会引发TypeError错误。 - timgeb

3
使用set来删除重复项,然后删除其他不需要的内容:
import re
result = set(['17.99', '0.0', '26.95', '26.95', '17.99', 'None', '0.0'])
result = [item for item in result if re.match('\d+\.\d+$', item)]
result = [item for item in result if float(item) != 0.0]

我不是给你点踩的,但或许我可以提供一些反馈。None'None'的比较结果为False。 - MrAlias
@Eli,我已经测试过了,你的解决方案现在没有提供我需要的结果。 - smith
1
这感觉有点受限。那么'0.00'呢? - timgeb
1
@timgeb 是对的。我没有意识到那里会有其他类似的东西。已经修复以考虑等于0的任何内容。仍然只有4行。 - Eli
1
这在输入1.2e+19时会失败。使用正则表达式来完成这个任务就像用大锤子去打苍蝇一样。 - msw
显示剩余10条评论

2

@timgeb:您的答案准确无误,但您可以只使用set:

set_map = ['17.99', '0.0', '26.95', '26.95', '17.99', 'None', '0.0']
new_map = []
for item in set(set_map):
    try:
        item = float(item)
        if item > 0: new_map.append(item)
    except ValueError:
        continue

new_map

1
  • 将数字转换为浮点数,以消除文本表示中的歧义('12.34'与'0012.3400')
  • 使用for循环,因为可能需要捕获异常
  • 使用set过滤重复项。

通常我更喜欢列表推导式,但在必须捕获异常的情况下,这种方法效果不佳。在这种情况下,可以使用float()进行转换。

In [1]: data = ['17.99', '0.0', '26.95', '26.95', '17.99', 'None', '0.0']

In [2]: nw = set()

In [3]: for j in data:
   ...:     try:
   ...:         k = float(j)
   ...:         if k:
   ...:             nw.add(k)
   ...:     except ValueError:
   ...:         pass
   ...:     

In [4]: print nw
set([0.0, 26.95, 17.99])

In [5]: list(nw)
Out[5]: [0.0, 26.95, 17.99]

这不保留原始顺序(我不确定是否需要,但我认为是),仍然包含0.0。 - timgeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接