Python第三周 學習筆記(2)
阿新 • • 發佈:2018-04-08
學習筆記選擇排序:
- 時間復雜度O(n**2)
- 沒有辦法知道當前輪是否已經達到排序要求,但是可以知道極值是否在目標索引位置上
- 遍歷次數1,...,n-1之和n(n-1)/2
- 對比冒泡法:減少了交換次數,提高了效率,性能略好
- 方法三、四實際上降低的是平均時間復雜度
方法一:
nums = [1, 2, 6, 7, 8, 9, 3, 4, 5] for i in range(len(nums)): maxindex = i for j in range(i + 1, len(nums)): if nums[j] < nums[maxindex]: maxindex = j if i != maxindex: nums[i], nums[maxindex] = nums[maxindex], nums[i] print(nums)
方法二(基於方法一的優化):
- 優化點:內循環一次遍歷同時取出最大、最小值 放在兩端
nums = [7, 19, 15, 12, 15, 5, 13, 14, 8, 15] length = len(nums) for i in range(length // 2): maxindex = i minindex = length - i - 1 minorigin = length - i - 1 for j in range(i + 1, length - i): if nums[j] > nums[maxindex]: maxindex = j if nums[j-1] < nums[minindex]:#正序比較 或者逆序比較都可以 length - j - 1 minindex = j - 1 if i != maxindex: nums[i], nums[maxindex] = nums[maxindex], nums[i] if i == minindex: #如果i就是最小值索引,則執行此if,因為上一行索引i的值與最大值已經進行了交換 minindex = maxindex if minorigin != minindex: nums[minorigin], nums[minindex]=nums[minindex], nums[minorigin] print(nums)
方法三(基於方法二的優化):
- 優化點:如果一次叠代最大值與最小值相等則剩余元素值相同,即已排序完畢
nums = [7, 19, 15, 12, 15, 5, 13, 14, 8, 15] length = len(nums) for i in range(length // 2): maxindex = i minindex = length - i - 1 minorigin = length - i - 1 for j in range(i + 1, length - 1): if nums[j] > nums[maxindex]: maxindex = j if nums[length - j - 1] < nums[minindex]: minindex = length - j - 1 if minindex == maxindex: #! break if i != maxindex: nums[i], nums[maxindex] = nums[maxindex], nums[i] if i == minindex: minindex = maxindex if minorigin != minindex: nums[minorigin], nums[minindex] = nums[minindex], nums[minorigin] print(nums)
方法四(基於方法三的優化):
- 如果列表為下面這種情況,最小值無需交換
nums =[1, 1, 1, 1, 1, 1, 1, 1, 2] length = len(nums) for i in range(length // 2): maxindex = i minindex = length - i - 1 minorigin = length - i - 1 for j in range(i + 1, length - 1): if nums[j] > nums[maxindex]: maxindex = j if nums[length - j - 1] < nums[minindex]: minindex = length - j - 1 if minindex == maxindex: #! break if i != maxindex: nums[i], nums[maxindex] = nums[maxindex], nums[i] if i == minindex: minindex = maxindex if minorigin != minindex and nums[minorigin] != nums[minindex]: #! nums[minorigin], nums[minindex] = nums[minindex], nums[minorigin] print(nums)
習題解析
1.用戶輸入一個數字
- 打印每一位數字及其重復的次數
方法一:
num = input(‘>>>‘) d = {} for c in num: if not d.get(c): d[c] = 1 continue d[c] += 1 print(d)
方法二:
d ={}
for c in num:
if c not in d.keys():
d[c] = 1
else:
d[c] += 1
print(d)
2.數字重復統計
- 隨機產生100個整數
- 數字的範圍[-1000, 1000]
- 升序輸出所有不同的數字及其重復的次數
import random n = 100 nums = [0] * n for i in range(n): nums[i] = random.randint(-1000, 1000) print(nums) t = nums.copy() t.sort() print(t) d = {} for x in nums: if x not in d.keys(): d[x] = 1 else: d[x] += 1 print(d) d1 = sorted(d.items()) print(d1)
3.字符串重復統計
- 字符表‘abcdefghijklmnopqrstuvwxyz‘
- 隨機挑選2個字母組成字符串,共挑選100個
- 降序輸出所有不同的字符串及重復的次數
import random alphabet = ‘abcdefghijklmnopqrstuvwxyz‘ words = [] for _ in range(100): words.append(‘‘.join(random.choice(alphabet) for _ in range(2))) d = {} for x in words: d[x] = d.get(x, 0) + 1 print(d) d1 = sorted(d.items(), reverse = True) print(d1)
4.返回1-10平方的列表
[i ** 2 for i in range(1,11)]
5.有一個列表lst = [1,4,9,16,2,5,10,15],生成一個新列表,要求新列表元素是lst相鄰2項的和
lst = [1,4,9,16,2,5,10,15]
[lst[i] + lst[i + 1] for i in range(len(lst) - 1)]
6.打印九九乘法表
[print(‘{}*{}={:<{}}{}‘.format(j, i, j * i,2 if j ==1 else 3, ‘‘ if i != j else ‘\n‘),end = ‘‘)for i in range(1,10) for j in range(1,i + 1)]
7."0001.abadicddws" 是ID格式,要求ID格式是以點號分割,左邊是4位從1開始的整數,右邊是
10位隨機小寫英文字母。請依次生成前100個ID的列表
import random
[(‘{:>04}‘.format(i) + ‘.‘ + ‘‘.join(‘abcdefghijklmnopqrstuvwxyz‘[random.randint(0,25)] for _ in range(10))) for i in range(1,101)]
Python第三周 學習筆記(2)