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
我有这个列表
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