iT邦幫忙

0

python list問題 (解決)

想請問大家有沒有辦法讓兩個串列能互相呼應?
想要做出照分數排列由高到低,但只會做分數的,不清楚字串要如何跟著一起排列
list0=["1號 ","2號 ","3號 ","4號 ","5號 "]
list1= [90,88,92,60,70]
print("依照分數排列結果 :")
list1new=sorted(list1,reverse=True)
for j in range(0,5):
print(list0[j],str(list1new[j])+"分")
要呈現的樣子:
3號 92分
1號 90分
2號 88分
5號 70分
4號 60分

3
hokou
iT邦新手 1 級 ‧ 2021-12-02 16:49:18
最佳解答
list0 = ["1號 ","2號 ","3號 ","4號 ","5號 "]
list1 = [90,88,92,60,70]
print("依照分數排列結果 :")
list1new = sorted(range(len(list1)), key=lambda k: list1[k], reverse=True)

for j in range(0,5):
    print(list0[list1new[j]], str(list1[list1new[j]])+"分")
依照分數排列結果 :
3號  92分
1號  90分
2號  88分
5號  70分
4號  60分

參考資料:how to return index of a sorted list? [duplicate]

想請問一下這段是甚麼意思 key=lambda k: list1[k] 因為還沒學過//

hokou iT邦新手 1 級 ‧ 2021-12-06 09:00:11 檢舉

非常感謝您~

3
alexwang0405
iT邦新手 5 級 ‧ 2021-12-02 16:51:25

我會用字典儲存資料,然後再去做排序

student = {
    "1號": 90,
    "2號": 88,
    "3號": 92,
    "4號": 60,
    "5號": 70
}

# dict.items() 轉成tuple
sort_by_grade = sorted(student.items(), key=lambda item: item[1], reverse=True)
print(sort_by_grade)

輸出結果:

[('3號', 92), ('1號', 90), ('2號', 88), ('5號', 70), ('4號', 60)]
4
一級屠豬士
iT邦大師 1 級 ‧ 2021-12-02 23:26:22
#!/usr/local/bin/python3

list0=["1號 ","2號 ","3號 ","4號 ","5號 "]
list1= [90,88,92,60,70]
list2 = list(zip(list0, list1))
list2.sort(key = lambda x: x[1], reverse=True)
print("\n".join(f"{elem[0]}  {elem[1]} 分" for elem in list2))

https://ithelp.ithome.com.tw/upload/images/20211202/20050647QYqtx9b4Gd.png

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-12-03 10:13:21

可以
用「自己排序法」

# -*- coding: UTF-8 -*-

list0=["1號 ","2號 ","3號 ","4號 ","5號 "]
list1= [90,88,92,60,70]

print("依照分數排列結果 :")
for i in range(len(list1)):
    for j in range(i + 1, len(list1)):
        if list1[i] < list1[j]:
           list1[i], list1[j] = list1[j], list1[i]
           list0[i], list0[j] = list0[j], list0[i]

for j in range(0,5):
	print(list0[j],str(list1[j])+"分")
0
inndy
iT邦新手 5 級 ‧ 2021-12-06 12:22:51
list0 = ["1號 ","2號 ","3號 ","4號 ","5號 "]
list1 = [90,88,92,60,70]
list2 = list(zip(list0, list1))
print("依照分數排列結果 :")
for name, score in sorted(list2, reverse=True, key=lambda k: k[1]):
    print("%s: %d分" % (name, score))

https://ideone.com/ERP1e1

首先要有個觀念,名字與成績應該是同一筆資料,不該存放在不同的 list 內,這種做法很不 Pythonic,所以用 zip 把兩個 list 的資料給合併成一組 list of tuple

>>> list2 = list(zip(list0, list1))
>>> list2
[('1號 ', 90), ('2號 ', 88), ('3號 ', 92), ('4號 ', 60), ('5號 ', 70)]

接下來要排序的時候,可以使用 sortedkey 參數,來指定要以什麼東西作為排序的依據,最後 for 迴圈使用 python 的語法直接拿出 list 內的每個 value

參考資料:
https://docs.python.org/3/library/functions.html#sorted
https://docs.python.org/3/tutorial/controlflow.html#lambda-expressions
https://docs.python.org/3/tutorial/controlflow.html#for-statements

我要發表回答

立即登入回答