菜农成长记:
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
1 3 5 4 2
1 3 4 5 2
1 3 4 2 5
——————
1 3 4 2 5
1 3 4 2 5
1 3 2 4 5
—————
1 3 2 4 5
1 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)