如何在没有任何排序功能的情况下按字母顺序对字符串数组进行排序?蟒蛇

时间:2019-10-30 03:38:30

标签: python arrays string list numpy

解决以下问题时: “假设您有一个随机的字符串列表(例如:a,b,c,d,e,f,g),请编写一个程序,以字母顺序对字符串进行排序。 您不能使用sort命令。“

我遇到了通过以下代码运行字符串的问题,有时使我在最终列表中出现重复的字符串

我对python还是很陌生,我们的类才刚刚开始研究numpy和该模块中的函数,并且不确定代码中是否使用了任何东西(除任何排序函数外)。

import numpy as np

list=[]
list=str(input("Enter list of string(s): "))
list=list.split()
print() # for format space purposes
listPop=list
min=listPop[0]
newFinalList=[]

if(len(list2)!=1):
    while(len(listPop)>=1):
        for i in range(len(listPop)):
            #setting min=first element of list
            min=listPop[0]
            if(listPop[i]<=min):
                min=listPop[i]
                print(min)    
        listPop.pop(i)
        newFinalList.append(min)
    print(newFinalList)
else:
    print("Only one string inputted, so already alphabatized:",list2)

[“ a”,“ y”,“ z”]的预期结果

[“ a”,“ y”,“ z”]

实际结果...

输入字符串列表:a y z

a 一种 一种 ['a','a','a']

输入字符串列表:d e c

d C d d ['c','d','d']

3 个答案:

答案 0 :(得分:1)

您可以为它实施快速排序:

def partition(arr,low,high): 
    i = ( low-1 )        
    pivot = arr[high]
    for j in range(low , high):     
        if arr[j] <= pivot:         
            i = i+1
            arr[i],arr[j] = arr[j],arr[i]
    arr[i+1],arr[high] = arr[high],arr[i+1] 
    return ( i+1 ) 

def quickSort(arr,low,high): 
    if low < high:      
        pi = partition(arr,low,high)        
        quickSort(arr, low, pi-1) 
        quickSort(arr, pi+1, high) 

arr = ['a', 'x', 'p', 'o', 'm', 'w'] 
n = len(arr) 
quickSort(arr,0,n-1) 
print ("Sorted list is:") 
for i in range(n): 
    print ("%s" %arr[i]),

输出:

Sorted array is:
a m o p w x

答案 1 :(得分:1)

选择排序:对于列表中的每个索引i,选择i或之后的最小项,并将其交换到第i位。这是三行的实现:

# For each index i...
for i in range(len(list)):
    # Find the position of the smallest item after (or including) i.
    j = list[i:].index(min(list[i:])) + i
    # Swap it into the i-th place (this is a no-op if i == j).
    list[i], list[j] = list[j], list[i]
  • list[i:]list的一个切片(子集),从第i个元素开始。
  • min(list)为您提供list中最小的元素。
  • list.index(element)为您提供elementlist的(第一个)索引。
  • a, b = b, a自动交换ab的值。

此实现最棘手的部分是,当您使用index查找最小元素的索引时,需要在与找到元素相同的list[i:]切片中查找索引输入,否则您可以在列表的较早部分中选择一个重复元素。由于要找到相对于list[i:]的索引,因此需要向其添加i才能在整个list中获得索引。

答案 2 :(得分:0)

合并排序:

from heapq import merge
from itertools import islice

def _ms(a, n):
    return islice(a,n) if n<2 else merge(_ms(a,n//2),_ms(a,n-n//2))

def mergesort(a):
    return type(a)(_ms(iter(a),len(a)))

# example

import string
import random

L = list(string.ascii_lowercase)
random.shuffle(L)
print(L)
print(mergesort(L))

样品运行:

['h', 'g', 's', 'l', 'a', 'f', 'b', 'z', 'x', 'c', 'r', 'j', 'q', 'p', 'm', 'd', 'k', 'w', 'u', 'v', 'y', 'o', 'i', 'n', 't', 'e']
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']