Python_GitHub_L2Q8(字典知识和冒泡排序)

菜农成长记:

Question 8
Level 2
Question:
Write a program that accepts a comma separated sequence of words as input and prints the words in a comma-separated sequence after sorting them alphabetically.
Suppose the following input is supplied to the program:
without,hello,bag,world
Then, the output should be:
bag,hello,without,world

原题目很简单,只需要引用一个sort函数即可排序。不过首先要将输入的一整条字符串进行拆分。

那么,如何在不使用sort函数的情况下进行排序呢?

最初并未想到去搜索各种排序方法,而是尝试用自己已有的知识进行排序。

字典

思路1:首先创建一个字典,分别对26个小写字母进行赋值。这里顺带学习了如何给空字典加内容。

以下是我想实现的:

wlist = {"a": 1, "b": 2, "c": 3, "d": 4, "e": 5, "f": 6, "g": 7, "h": 8, "i": 9,
         "j": 10, "k": 11, "l": 12, "m": 13, "n": 14, "o": 15, "p": 16, "q": 17,
         "r": 18, "s": 19, "t": 20, "u": 21, "v": 22, "w": 23, "x": 24, "y": 25,
         "z": 26}

1. 两个成对的元素,如:(1, 2)可以构成字典的key和value—— dict = {1: 2}

[(1, 2), (3, 4)]就是—— dict = {1: 2, 3: 4}。

可是这样的列表里面套元组有点麻烦哦,再换个思路。

2. 字符串是特殊的列表,或许我可以求出小写字母(按顺序排列)字符串的长度,得到字母数(众所周知的26),放在循环里range下,但要注意索引是从0开始的。

于是:

dictionary = {}
a = "abcdefghijklmnopqrstuvvxyz"
for i in range(1,27):
    dictionary[a[i-1]] = i

字符串是特殊的列表,其索引和列表相同,用索引(按顺序)将字符串中的字母取出,作为key放在字典内,并进行赋值,就得到了字典。

注意,字典的索引只需要key就可以了。

思考中发现,用字典就是多此一举,因为python本身就知道字母的顺序……

于是在李老师的提点下,选择使用函数,比较两个单词字符串的大小,函数如下:

def bidaxiao(str1, str2):
    l1 = [len(str1), len(str2)]
    for i in range(min(l1)):
        if dict[str1[i]] < dict[str2[i]]:
            return True
        elif dict[str1[i]] == dict[str2[i]]:
            continue
        else:
            return False

    return len(str1) < len(str2)

(这里不包含“两个字符串一毛一样”的特殊情况)

思路:将两个字符串的长度放在列表里,谁短按谁的来。用到了min函数。

比较大小返回的就是True和FALSE,并不是什么值。

如果字母相同咋办,继续!continue。这里要注意,elif的书写形式和if一样。

比较两个单词的大小就出来了。结果后来发现python根本不需要这函数,人家自己会比较。这又是后话了,不过借此机会了解了比大小的函数写法。

比较大小结束后,来看排序吧。

冒泡排序

李老师叽里呱啦说了一大堆排序方法,告诉我,你先去看冒泡排序。

我:???冒泡?

这里仅参考了菜鸟教程里的冒泡排序:

Python 冒泡排序 | 菜鸟教程 (runoob.com)

简单的举个例子:

给一个固定的字符串:5, 1, 3, 4, 2

长度为5。

冒泡排序是怎么做的呢?

5  1  3  4  2

1  5  3  4  2

3  5  4  2

1  3  4  5  2

1  3  4  2  5

——————

1  3  4  2  5

3  4  2  5

1  3  2  4  5

—————

1  3  2  4  5

2  3  4  5

——————

1  2  3  4  5

——————

其实是两个for叠加循环,且第二个for内部循环次数逐渐减少

代码如下:(numofstr 译为: the number of string)

def maopao(strlist):
    # 冒泡排序函数
    numofstr = len(strlist)
    for a in range(numofstr):
        for b in range(0, numofstr-a-1):
            if strlist[b] > strlist[b + 1]:
                strlist[b], strlist[b + 1] = strlist[b + 1], strlist[b]
            else:
                continue
    return strlist

一旦发现前面的数比后面的数大,就调换位置。

注意,这里的参数是列表,如果想要输入一段字符串,还需要将其切分。

所以再来一个函数:

def slipstr(string):
    # 将一整串字符串按逗号间隔拆分,
    strlist = []
    str2 = ""
    for str1 in string:
        if str1 != ",":
            str2 += str1
        else:
            strlist.append(str2)
            str2 = ""
    strlist.append(str2)

    return strlist

函数的调用:

num = input("输入以逗号为间隔的数字,字母,单词进行排序:")
numlist = slipstr(num)
finallist = maopao(numlist)
print(finallist)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值