加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 对于给定的浮点数列表,有没有办法可以找到给定整个部

发布时间:2020-12-20 11:58:46 所属栏目:Python 来源:网络整理
导读:我遇到了这个问题,在那里我被绊倒了. 问题是这个. 我有一个这样的列表: L = [2.1,2.2,2.3,2.4,2.5,3.1,3.2,3.3,3.4,4.1,4.2,4.3,4.4,5.1,5.2,5.3,5.4,5.5,5.6,6.1,6.2,6.3,6.4,6.5,7.1,7.2,7.3,7.4,7.5,8.1,8.2,8.3,8.4,8.5,9.1,9.2,9.3,9.4,9.5,10.1,10.2,
我遇到了这个问题,在那里我被绊倒了.
问题是这个.
我有一个这样的列表:

L = [2.1,2.2,2.3,2.4,2.5,3.1,3.2,3.3,3.4,4.1,4.2,4.3,4.4,5.1,5.2,5.3,5.4,5.5,5.6,6.1,6.2,6.3,6.4,6.5,7.1,7.2,7.3,7.4,7.5,8.1,8.2,8.3,8.4,8.5,9.1,9.2,9.3,9.4,9.5,10.1,10.2,10.3,10.4,10.5,11.1,11.2,11.3,11.4,11.5,12.1,12.2,12.3,12.4,12.5]

需要:
ans = [[2,5],[3,4],[4,……]

即整数和最大小数部分.

我们应该怎么做?

到目前为止,我试过这个:

# Imports
import numpy as np
import math

L = [2.1,12.5]

whole = [ int(str(x).split(".")[0]) for x in L]
frac = [ int(str(x).split(".")[-1]) for x in L]
wf = [[w,f] for w,f in zip(whole,frac)]

wset = list(set(whole))

print(whole)
print(frac)
print(wf)
print(wset)

解决方法

这是一个numpy解决方案:

L.sort() # skip this if L is already sorted
Li = L.astype(int)
uniq = np.r_[np.where(np.diff(Li))[0],Li.size-1]
int_part = Li[uniq]
max_frac = np.round((L[uniq]-int_part) * 10).astype(int)
np.c_[int_part,max_frac].tolist()
# [[2,[5,6],[6,[7,[8,[9,[10,[11,[12,5]]

一些时间:

import numpy as np
import itertools as it
from timeit import timeit

def pp(L):
    Li = L.astype(int)
    uniq = np.r_[np.where(np.diff(Li))[0],Li.size-1]
    int_part = Li[uniq]
    max_frac = np.round((L[uniq]-int_part) * 10).astype(int)
    return np.c_[int_part,max_frac].tolist()

def johnchase(L):
    vals = []
    foo = [str(e).split('.') for e in L]
    for key,group in it.groupby(foo,lambda x: (x[0])):
        vals.append([int(e) for e in max(group)])
    return vals

def bernie(L):
    return [[k,int(round(max(i % 1 for i in g)*10,1))]
            for k,g in it.groupby(L,lambda x:int(x))]

def kprabhakaran(L):
    return [map(int,str(max(list(cgen))).split('.'))
     for c,cgen in it.groupby(L,lambda x:int(x))]

def prep(N,k):
    global L
    L = np.sort(np.random.choice(np.arange(N) / 10,k,False))

N,n = 2 * 10**6,10**6,10

for func in pp,johnchase,bernie,kprabhakaran:
    print('{:20s}'.format(func.__name__),'{:6.4f} secs'.format(timeit(
        lambda: func(L),lambda: prep(N,k),number=n) / n))

打印:

pp                   0.0379 secs
johnchase            1.7252 secs
bernie               1.4773 secs
kprabhakaran         0.7592 secs

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读