Python:从列表中删除具有相同楼层功能的号码

Python: Remove numbers with the same floor function from a list

我有这个列表

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5]

我想删除具有相同 floor 函数的数字并获取每个整数的第一个数字:

x = [1.1, 2.1, 3.0, 4.5] 

我试过了

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5]
def h(l): 
    y = []
    for i in l: 
        if int(i) != int(i+1):
            z = i 
            y.append(z) 
    return(y)
print(h(x))

但是当我打印它时,它产生了与列表相同的结果

如果 x 未排序,您可以使用 itertools.groupby 先排序

out = [next(g) for k, g in itertools.groupby(x, floor)]
out
# [1.1, 2.1, 3.0, 4.5]

min 函数上的一个小键映射并设置为列表转换有效:

import numpy as np

x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5]
z = list(set([min(x, key=lambda i: i - np.floor(c) if i >= np.floor(c) else max(x)) for c in x]))
print(z)

比使用 itertools.groupby 更通用的解决方案如下:

def first_floor(numbers):
    seen = set()
    for x in numbers:
        f = floor(x)
        if f not in seen:
            seen.add(f)
            yield x

然后:

>>> x = [1.1, 1.2, 1.2, 2.1, 2.2, 3.0, 4.5]
>>> list(first_floor(x))
[1.1, 2.1, 3.0, 4.5]

对于排序数据,这几乎一样快。对于未排序的数据,它比排序和使用 groupby

快得多
>>> x = [random.random()*10 for i in range(100)]
>>> %timeit [next(g) for k, g in itertools.groupby(sorted(x), floor)]
1000000 loops, best of 3: 19 µs per loop
>>> %timeit list(first_floor2(x))
1000000 loops, best of 3: 12.6 µs per loop