Python Functions, Files, and Dictionaries6: sorting

 

Dictionaryはsortできないからlistにして作り直す

いや、dictionaryもsortできました。だが、sortしたら辞書でなくなる。

 

Pythonはsortが得意な言語のようです。

sorted(sortedされる辞書, key = sortする基準)でvalueの値によってsortedされたkeysを一撃で取得する!!!!!!!

returnは、listではなく、elementにすること

medals = {‘Japan’:41, ‘Russia’:56, ‘South Korea’:21, ‘United States’:121, ‘Germany’:42, ‘China’:70}
#medalsのkeysだけsortされる。
print(sorted(medals))# print(medals.keys())と同じ。

#medalsのvalluesを基準としてmedalsのkeysをsortする。
def sorting_f(i): # iはfirst parameter つまりmedalsのkeyを参照する。
return medals[i] #medalsのiに対応するvalueをreturnする。

#first parameter: medalsつまりdictionaryのkeysをsortする。
#second parameter: sortする基準をsorting_fで定義する。
print(sorted(medals, key = sorting_f, reverse= True))
top_three = sorted(medals, key = sorting_f, reverse= True)[:3]

 

同様。

groceries = {‘apples’: 5, ‘pasta’: 3, ‘carrots’: 12, ‘orange juice’: 2, ‘bananas’: 8, ‘popcorn’: 1, ‘salsa’: 3, ‘cereal’: 4, ‘coffee’: 5, ‘granola bars’: 15, ‘onions’: 7, ‘rice’: 1, ‘peanut butter’: 2, ‘spinach’: 9}

def sorting_f(hoge):
return groceries[hoge]

most_needed = sorted(groceries, key = sorting_f, reverse = True)

sorted(list)は新しいlist objectを作るが、list.sort()はlistを書き換えてしまう。

list.sort()はmethod syntax ←listにしか使えないし、mutateするのでconfusing

sorted(list)はfunction syntax ← こちらを使いましょう。list以外のsequenceにも使える。

sort()はintegerを小さい方から、stringをalphabetic orderに入れ替える。

valueを変えるmutationとsortは違う。

 

variable = sorted(L2)でも

sorted(L2)でもどちらのexpressionでも可能。

sorted(L2)は入れ替えたL2をreturnしてくれる。

 L2.sort()は何もreturnしない。L2をsortするだけ。

L1 = [1, 7, 4, -2, 3]
L2 = [“Cherry”, “Apple”, “Blueberry”]
print(“///L1”)
print(id(L1))
print(L1)

print(“///L1.sortはvariableなしでL1をsortする。”)
L1.sort() #L1_sort = L1.sort()とは書かない。
#L1_sort = L1.sort()と書くのはやめましょう。
#<built-in method <native JS> of type object>が出る。
print(L1) #L1は書き換えられている。
print(L1.sort)
#print(type(L1.sort()) これをかくとerror出る。
#<built-in method <native JS> of type object>
print(id(L1)) #L1は書き換えられているがidは変わっていない

print(“///L2_sortedは関数のように使うためvariableとargumentがいる”)
L2_sorted = sorted(L2)#この時だけsortedされたobjectが生成される
print(L2)
print(id(L2))
print(L2_sorted)
print(id(L2_sorted))
#sorted()を呼び出すたびに新しいidがつく?
print(sorted(L2))
print(id(sorted(L2)))

print(L2) #L2.sort()と違って、L2objectは変更されない。

 

optional sorted() parameter1: reverse = True

sorted(obj, key = func)でfuncのargumentは自動的にobjのelementになる件

optional sorted() parameter2 : key = function name←()書いたらだめ

並べ替える指標(property)を関数で指定する。

#sortedで呼び出されるkeyとなるfunctionのargumentは適当でいい????

sortedの第一argumentで指定されたsequenceの要素(dictionaryの場合はkey)が自動的に

key = functionのargementに入る。

dictionaryのvalueでsortしたいならretuen dictionary[nandemoii]

dictionary = {“Flowers”: 10, ‘Trees’: 20, ‘Chairs’: 6, “Firepit”: 1, ‘Grill’: 2, ‘Lights’: 14}
new_dictionary = {}

#.keys()はlist()でobjectにしないと使えなかった!
dictionary_keys = list(dictionary.keys())
print(dictionary_keys)

#sortedで呼び出されるkeyとなるfunctionのargumentは適当でいい????
def key_f(nandemoii):
return dictionary[nandemoii]
# keyは、functionの名前。
print(sorted(dictionary_keys, key= key_f, reverse= True))

sortedの第一argumentで指定されたsequenceの要素(dictionaryの場合はkey)が自動的に

key = functionのargementに入る。

fruits = [‘peach’, ‘kiwi’, ‘apple’, ‘blueberry’, ‘papaya’, ‘mango’, ‘pear’]
new_order = sorted(fruits,
#key内のfunctionのargumentはなんでもいい。
#sortedの第一argumentで指定されたsequenceの要素が自動的に入る。
key=lambda fruit_name: (len(fruit_name), fruit_name))
#returnでtupleを使うと、ダブルスタンダードでsortする。
for fruit in new_order:
print(fruit)

sortedの第一argumentで指定されたsequenceの要素(dictionaryの場合はkey)が自動的に

key = functionのargementに入る。

weather = {‘Reykjavik’: {‘temp’:60, ‘condition’: ‘rainy’},
‘Buenos Aires’: {‘temp’: 55, ‘condition’: ‘cloudy’},
‘Cairo’: {‘temp’: 96, ‘condition’: ‘sunny’},
‘Berlin’: {‘temp’: 89, ‘condition’: ‘sunny’},
‘Caloocan’: {‘temp’: 78, ‘condition’: ‘sunny’}}

sorted_weather = sorted(weather,
#この時点で出てくるlistはweatherのkeysだと確定。
key=lambda w: (weather[w][‘temp’], w))
#最初にweatherのvalueの’temp’のvalueを参照する。
#次にwatherのkeyを参照してsortする。

print(sorted_weather)

print(sorted(weather))#これはweatherのkeyでsortしたリストが出てくるだけ。

tips reverse = True と -マイナス

何これ?tips?

optional parameter “key”にassignされたfunctionがreturnする数値を見てsortするが、sortされるsequenseはreturnされた値によってmutateされない。

 

 

こんな感じ

#このstringはkey = second_letによって、ex_lstの各elementが自動的に選ばれるようだ。

ex_lst = [‘hi’, ‘how are you’, ‘bye’, ‘apple’, ‘zebra’, ‘dance’]

def second_let(string):
#このstringはkey = second_letによって、ex_lstの各elementが自動的に選ばれるようだ。
return string[1]

sorted_by_second_let = sorted(ex_lst, key = second_let)
print(sorted_by_second_let)

 

sorting a dictionary でkey = functionでlambda使ってもいい。

省略した方が良さげな時もあれば、省略しない方がいい時もあるさ。readability

for statement はindex 1から順に入れていくから、sorted()しておくと欲しい順番で出てくる。

lambda使わないとこうなる。

sorted(L2)は入れ替えたL2をreturnしてくれる。

 L2.sort()は何もreturnしない。L2をsortするだけ。

sortの仕方が複雑な時はlambda使わず関数を別で定義する。

Sで始まるcityが多い順でstateをsortする。

def s_cities_count(city_list):
ct = 0
for city in city_list:
if city[0] == “S”:
ct += 1
return ct

states = {“Minnesota”: [“St. Paul”, “Minneapolis”, “Saint Cloud”, “Stillwater”],
“Michigan”: [“Ann Arbor”, “Traverse City”, “Lansing”, “Kalamazoo”],
“Washington”: [“Seattle”, “Tacoma”, “Olympia”, “Vancouver”]}

print(sorted(states,
#statesのkeyをsortしたlistが出てくる。
key=lambda state: s_cities_count(states[state])))
#s_cities_countのargument(city_list)にstatesのkeyを送る。
#この動きはsorted()専用????????関数のargumentを指定。

sortedの第一argumentで指定されたsequenceの要素(dictionaryの場合はkey)が自動的に

key = functionのargementに入る。

 

dictionaryをsortしてみた。keyから辞書をsortし直す。

keyをsortしてからそれに対応するvalueを元の辞書から引き出して新しい辞書を作る。

dictionary = {“Flowers”: 10, ‘Trees’: 20, ‘Chairs’: 6, “Firepit”: 1, ‘Grill’: 2, ‘Lights’: 14}

sorted_keys = sorted(dictionary.keys())
print(sorted_keys)

#dictionaryはsortedできない?!!!!?????
#keyに対応するvalueを辞書から一つづつ取得して新しい辞書を作る。

sorted_dictionary = {}
for k in sorted_keys:
v = dictionary[k]
sorted_dictionary[k] = v
print(sorted_dictionary)

dictionaryをsortしてみた。valueから辞書をsortし直す。

item()でdictionaryをtupleにしてlistとして扱う。

 

listの中のtupleをsortする。

まず、こうなる。

 

コメント