17

毎回長さが異なるリストがあり、それを最小から最大に並べ替えたい場合、どうすればよいでしょうか?

私が持っている場合:[-5, -23, 5, 0, 23, -6, 23, 67]

私が欲しい:[-23, -6, -5, 0, 5, 23, 23, 67]

私はこれから始めます:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67]

new_list = []

minimum = data_list[0]  # arbitrary number in list 

for x in data_list: 
  if x < minimum:
    minimum = value
    new_list.append(i)

しかし、これは一度しか通過せず、次のようになります。

new_list = [-23] 

これは私が立ち往生するところです。

len(new_list) = len(data_list)組み込みの max、min、sort 関数を使用せずにすべてをソートして (つまり、すべての数値が新しいリストに含まれるまで) ループし続けるにはどうすればよいですか? 新しいリストを作成する必要があるかどうかもわかりません。

4

24 に答える 24

43

私はあなたがこのようなことをしようとしていると思います:

data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
new_list = []

while data_list:
    minimum = data_list[0]  # arbitrary number in list 
    for x in data_list: 
        if x < minimum:
            minimum = x
    new_list.append(minimum)
    data_list.remove(minimum)    

print new_list
于 2012-08-15T05:34:54.560 に答える
4

sort()これは、、を使用しないという要件に厳密に従いますがmin()、車輪の再発明を行わないことでmax()Pythonのベストプラクティスも使用します。

data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
import heapq
heapq.heapify(data_list)
new_list = []
while data_list:
    new_list.append(heapq.heappop(data_list)))

Pythonライブラリを調べて、heapq.pyどのように機能するかを確認することをお勧めします。ヒープソートは、無限のストリームを「ソート」できるため、非常に楽しいソートアルゴリズムです。つまり、現在最小のアイテムをすばやく取得できるだけでなく、ソートするデータに新しいアイテムを効率的に追加することもできます。

于 2012-08-15T08:10:24.887 に答える
2

これはうまくいきます!

def sorting(li):
    for i in range(len(li)):
        for j in range(len(li)):
            if li[i] < li[j]:
                li[j],li[i] = li[i],li[j]
    return li

listToSort = [22,11,23,1,100,24,3,101,2,4]
print(sorting(listToSort))
于 2020-10-10T07:42:50.810 に答える
1
def bubble_sort(seq):
    """Inefficiently sort the mutable sequence (list) in place.
       seq MUST BE A MUTABLE SEQUENCE.

       As with list.sort() and random.shuffle this does NOT return 
    """
    changed = True
    while changed:
        changed = False
        for i in xrange(len(seq) - 1):
            if seq[i] > seq[i+1]:
                seq[i], seq[i+1] = seq[i+1], seq[i]
                changed = True
    return None

if __name__ == "__main__":
   """Sample usage and simple test suite"""

   from random import shuffle

   testset = range(100)
   testcase = testset[:] # make a copy
   shuffle(testcase)
   assert testcase != testset  # we've shuffled it
   bubble_sort(testcase)
   assert testcase == testset  # we've unshuffled it back into a copy

から: http://rosettacode.org/wiki/Bubble_Sort#Python

于 2012-08-15T05:20:41.183 に答える
1

これはあまり効率的ではないソートアルゴリズムです:)

>>> data_list = [-5, -23, 5, 0, 23, -6, 23, 67]
>>> from itertools import permutations
>>> for p in permutations(data_list):
...     if all(i<=j for i,j in zip(p,p[1:])):
...         print p
...         break
... 
(-23, -6, -5, 0, 5, 23, 23, 67)
于 2012-08-15T05:29:15.360 に答える
0

解決

mylist = [1, 6, 7, 8, 1, 10, 15, 9]
print(mylist)
n = len(mylist)
for i in range(n):
    for j in range(1, n-i):
        if mylist[j-1] > mylist[j]:
             (mylist[j-1], mylist[j]) = (mylist[j], mylist[j-1])
print(mylist)
于 2015-10-06T02:59:55.207 に答える
0

私の方法-

s = [-5, -23, 5, 0, 23, -6, 23, 67]
nl = []
for i in range(len(s)):
    a = min(s)
    nl.append(a)
    s.remove(a)

print nl
于 2015-09-12T22:25:26.407 に答える
0

Swapping the values from 1st position to till the end of the list, this code loops for ( n*n-1)/2 times. Each time it pushes the greater value to the greater index starting from Zero index.

list2 = [40,-5,10,2,0,-4,-10]
for l in range(len(list2)):
    for k in range(l+1,len(list2)):
        if list2[k] < list2[l]:
            list2[k] , list2[l] = list2[l], list2[k]
print(list2)
于 2019-12-12T17:31:40.210 に答える
0

複雑さは問題ではないので、私はあなたに提示します... BogoSort:

from random import shuffle

def is_sorted(ls):
    for idx in range(len(ls)-1):
        if x[idx] > x[idx + 1]:
          return False
    return True

def sort(ls):
    while not is_sorted(ls):
        shuffle(ls)
    return ls


ls = list(range(5))
shuffle(ls)

print(
    "Original: ",
    ls
)

print(
    "Sorted: ",
    sorted(ls)
)
于 2020-10-10T08:08:17.667 に答える
0

min() 関数を使用すると簡単に実行できます

`def asc(a):
    b=[]
    l=len(a)
    for i in range(l):
        x=min(a)
        b.append(x)
        a.remove(x)
    return b
 print asc([2,5,8,7,44,54,23])`
于 2018-09-07T18:57:01.803 に答える
0

これはソートされていないリストで、1234567 が必要です。

list = [3,1,2,5,4,7,6]

def sort(list):
    for i in range(len(list)-1):
        if list[i] > list[i+1]:
            a = list[i]
            list[i] = list[i+1]
            list[i+1] = a
        print(list)       

sort(list)

配列をソートする最も簡単な方法。現在、バブルソートを使用しています。最初の2つの場所をチェックし、最小の数字を左に移動します。ループ内の「-n」は、インデントエラーを回避するためのもので、そうすることで理解できます。

于 2021-01-21T20:06:18.070 に答える
0

インプレース 挿入ソートアルゴリズムのより読みやすい例を次に示します。

a = [3, 1, 5, 2, 4]

for i in a[1:]:
    j = a.index(i)
    while j > 0 and a[j-1] > a[j]:
        a[j], a[j-1] = a[j-1], a[j]
        j = j - 1
于 2016-09-08T21:33:40.557 に答える
-1

len(new_list) = len(data_list) になるまでループし続けるにはどうすればよいですか

while len(new_list) != len(data_list):
    # ...

もしかしてこんな?

いいえ、新しいリストを作成する必要はありません。ほとんどの並べ替えアルゴリズムは、リストを変更することで機能します。

おそらくあなたがやろうとしているのは、別のリストを使用した選択ソートです。その並べ替えアルゴリズムの詳細については、ウィキペディアの記事を参照してください。単一のリストでどのように機能し、どれほど効率的であるかがわかります (ネタバレ: そうではありません)。

于 2012-08-15T05:22:02.037 に答える
-3
def getIndexOfMaximum(list1):
    index = 0
    emptyList = []
    value = list1[0]
    c = 0
    while (c == 0):
        for cell in list1:
            index += 1
            if (cell >= value):
                value = cell
                hold = index -1
            if (len(list1) == index):
                emptyList += [value]
                del list1[hold]
                index = 0
                value = 0
                if (len(list1) == 1):
                    newList = emptyList + list1
                    del list1[index]
                    c = 1
    return newList
print(getIndexOfMaximum([2,5,8,7,44,54,23]))

#TRY THIS!!!
于 2016-11-01T20:55:47.657 に答える