数字の配列を 'Bell'、 'C​​urve'、 'Wave'としてソートする

この値のリストを考えてみましょう:

print samples

[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]

n の新しい配列長に対して、 n 個の値を生成する必要があります。このようにすることができます。

for i in range(n):
        My_array.append(random.choice(samples))

今度は My_array でソートする必要があります:増加、減少、 'Bell'、 'C​​urve'、 'Wave'

最初の2つは

print sorted(My_array,reverse=False)
[5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.0, 9.0, 9.0, 10.0]


print sorted(My_array,reverse=True)
[10.0, 9.0, 9.0, 8.0, 8.0, 7.5, 7.0, 6.5, 6.0, 5.5]

残りの3つはいかがですか?

上記の例では、 'Bell'は次のようになります。

[5.5,6.5,7.0,8.0,9.0,10.0,9.0,8.0,7.5,6.0]

「曲線」は次のようになります。

[9.0,8.0,7.0,6.5,5.5,6.0,7.5,8.0,9.0,10.0]

と '波'はこれのようにする必要があります(実際にはそれが弦のようなものか正弦波なの​​かは関係ありません):

[5.5,7.0, 8.0, 10.0, 9.0,7.5, 6.0, 6.5, 8.0, 9.0]
2
nl ru de
Wave のサンプル出力をより多くの要素で表示できますか?つまり、波が常に2つの "ベル"を持っているか、または "ベル"のサイズが固定され、要素の数が増えるのでしょうか?
追加された 著者 Bakuriu,
ウェーブ[9.0、9.0、8.5、7.5、6.5、6.5、6.0、5.0、5.0、 5.0、8.0、9.0、9.5、9.5、10.0]私は本当に波の形成を気にしない、ちょうど 'ピーク'と '
追加された 著者 poscaman,

3 答え

Waveについては、ソートされた配列を d サブアレイに分割し、昇順に並べ替え、降順に並べ替えて並べるというAlex Lの考え方に従うことができます。

def wave_sort(array, num_peaks=None, start_ascending=True):
    """Sorts the elements of `array` in a sine or cosine manner.

    :param array: The array to be sorted.
    :param num_peaks: The number of (low and high) peaks in the resultant array
    :param start_ascending: If True the result is sin-like, otherwise cos-like.
    """
    if num_peaks is None:
        num_peaks = len(array)//6
    sorted_ar = sorted(array)
    subarrays = [sorted_ar[i::num_peaks] for i in range(num_peaks)]
    for i, subarray in enumerate(subarrays, start=int(not start_ascending)):
        if i % 2:
            # subarrays are in ascending order already!
            subarray.reverse()
    return sum(subarrays, [])

これを達成する別の方法は、ソートされた配列を d/2 サブアレイに分割し、各サブアレイに対してAlex Lソリューションを使用してBellを取得し、それらをまとめて配置することです。

3
追加された

「ベル」は2つのサブアレイであり、1つはソートされ、他のものは減少する。他の問題については、このアイデアを続行してください。

2
追加された

Bell/Curveのアイデア:

>>> ss = sorted(samples)
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> ss[::2]
[5.0, 6.0, 7.0, 8.0, 9.0, 10.0]
>>> ss[-2::-2]
[9.5, 8.5, 7.5, 6.5, 5.5]
>>> ss[-2::-2] + ss[::2]
[9.5, 8.5, 7.5, 6.5, 5.5, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0]

また、サンプル配列を並べ替えることを意味する場合は、メソッド(アイテムを複製する)ではなく、

for i in range(n):
        My_array.append(random.choice(samples))

あなたが使用することができます:

>>> samples
[5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0]
>>> shuffled = samples
>>> random.shuffle(shuffled)
>>> shuffled
[10.0, 6.0, 5.0, 6.5, 7.5, 7.0, 8.0, 8.5, 5.5, 9.0, 9.5]

またはリストの理解:

My_array = [random.choice(samples) for _ in range(n)]    
2
追加された
My_array.append(random.choice(samples))に 'samples'を追加するのを忘れました。私は今それを修正しました。 My_arrayにはn個のサンプルが含まれている必要があります。それ以外はあなたのアプローチをテストしています。ありがとう!
追加された 著者 poscaman,