2

この値のリストを考えると:

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で、5つの方法で並べ替える必要があります:増加、減少、「ベル」、「カーブ」、「ウェーブ」

最初の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つはどうですか?

上記の例では、「ベル」は次のようになります。

[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]

そして、「波」は次のようになります(それがcosのような波であるか正弦のような波であるかは実際には関係ありません):

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

3 に答える 3

3

Waveの場合、Alex Lのアイデアに従うことができます。並べ替えられた配列をサブ配列に分割し、dそれらの一部を昇順で並べ替え、その他を降順で並べ替えてから、それらをまとめます。

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ソリューションを使用してベルを取得し、それらをまとめることです。

于 2012-12-28T09:03:49.053 に答える
2

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

于 2012-12-28T07:43:05.077 に答える
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)]    
于 2012-12-28T07:43:34.453 に答える