2

下限/上限のいずれかに丸める必要がある特定の値を持つデータセットに取り組んでいます。

例えば。上限を9、下限を3にしたい場合、次のような数値があります-

[ 7.453511737983394, 
  8.10917072790058, 
  6.2377799380575, 
  5.225853201122676, 
  4.067932296134156 ]

そして、次のように 3 または 9 に丸められるようにリストしたい -

[ 9, 
  9, 
  9, 
  3, 
  3 ]

配列を反復処理して違いを見つけ、最も近いものを取得するなど、古き良き方法でそれを行うことができることを私は知っています。

私のアプローチコード:

for i in the_list[:]:
    three = abs(3-the_list[i])  
    nine = abs(9-the_list[i])

    if three < nine:
        the_list[i] = three
    else:
        the_list[i] = nine

次のようなPythonに組み込まれている迅速で汚い方法があるかどうか疑問に思っています:

hey_bound = round_the_num(number, bound_1, bound_2) 

できることはわかっていますmy-approach-codeが、これがはるかに優れた方法で実装されていることはほぼ確実です。見つけようとしましたが、見つけることができませんでした。

これに対する解決策への推測や直接リンクは驚くべきものです。

4

8 に答える 8

1

中間点との比較に関する@AbhishekPatelのアイデアが本当に好きです。しかし、結果を境界タプルのインデックスとして使用して、LC に入れます。

the_list = [ 7.453511737983394,
8.10917072790058, 
6.2377799380575, 
5.225853201122676, 
4.067932296134156 ]

hi = 9
lo = 3
mid = (hi + lo) / 2

[(lo, hi)[mid < v] for v in the_list]
# [9, 9, 9, 3, 3]

...しかし、これは numpy アプローチよりも 15 倍以上遅くなります。
ただし、ここでは よりも大きいhiまたは小さい数値を処理できますlo
...しかし、これも100000エントリリストのみです。OPによって投稿された元のリストの場合、2つのバリアントは非常に接近しています...

于 2018-12-11T18:59:42.217 に答える
1

minキー引数を変更して絶対的な違いを探すことにより、組み込み関数を使用したワンライナーリスト内包表記

upper_lower_bound_list=[3,9]
myNumberlist=[ 7.453511737983394, 
8.10917072790058, 
6.2377799380575, 
5.225853201122676, 
4.067932296134156 ]

リスト内包表記

[min(upper_lower_bound_list, key=lambda x:abs(x-myNumber)) for myNumber in myNumberlist]

出力

[9, 9, 9, 3, 3]
于 2018-12-11T16:27:06.340 に答える
1

リスト内包表記とラムダ関数を使用する別のオプション:

round_the_num = lambda list, upper, lower: [upper if x > (upper + lower) / 2 else lower for x in list]

round_the_num(l, 9, 3)
于 2018-12-11T16:27:20.683 に答える
1

次のように、リスト内包表記を行うカスタム関数を作成できます。

lst = [ 7.453511737983394, 
  8.10917072790058, 
  6.2377799380575, 
  5.225853201122676, 
  4.067932296134156 ]

def return_the_num(l, lst, h): 
    return [l if abs(l-x) < abs(h-x) else h for x in lst]

print(return_the_num(3, lst, 9))
# [9, 9, 9, 3, 3]
于 2018-12-11T16:27:23.937 に答える