iT邦幫忙

0

Python3 初始值問題(已解決)

JK 2018-09-13 16:32:381502 瀏覽
  • 分享至 

  • xImage
dict_counter={}
for food in ['spam','spam','eggs','spam']:
    if not food in dict_counter:
        dict_counter[food]=0    
    dict_counter[food]+=1
for food,count in dict_counter.items():
    print(food,count)

看不太懂為何初始值為何這樣打,not food 不是就表示若有非food元素出現才將dict_counter[food]設為零,但是實際執行應該會跳過這段吧

看更多先前的討論...收起先前的討論...
神Q超人 iT邦研究生 5 級 ‧ 2018-09-13 16:42:13 檢舉
一開始的dict_counter是空的,
所以再跑迴圈的時候會判斷目前的food在dict_counter中有沒有資料,
沒有的話就加進dict_counter並同時設定該food為0,
出來後再+1。

如果已經有資料就不會跑進去,
會直接+1
神Q超人 iT邦研究生 5 級 ‧ 2018-09-13 16:42:13 檢舉
不知道為什麼跳了兩次~_~
froce iT邦大師 1 級 ‧ 2018-09-13 18:09:57 檢舉
要這樣看
if not (food in dict_countet):
froce iT邦大師 1 級 ‧ 2018-09-13 18:51:12 檢舉
然後一開始dict_counter是空的,你不先給初始值,dict_counter[food] += 1會跳key error出來
JK iT邦新手 5 級 ‧ 2018-09-13 19:43:55 檢舉
謝謝兩位高手我懂了!!!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

3
froce
iT邦大師 1 級 ‧ 2018-09-13 19:00:48
最佳解答

因為其實上面回答完了,所以提供個簡化的作法好了。

dict_counter={}
for food in ['spam','spam','eggs','spam']:
    if not food in dict_counter:
        dict_counter[food]=0

等同於:

foods = ['spam','spam','eggs','spam']
dict_counter = dict((food, 0) for food in set(foods))

甚至整段code可以變成一行:

count_foods = dict((food, foods.count(food)) for food in set(foods))

然後python的神奇之處在於一行的code比5行的還容易搞清楚。(茶

JK iT邦新手 5 級 ‧ 2018-09-13 19:45:42 檢舉

最後一段是生成式吧,好難想到可以變成這種寫法阿
謝謝force的回覆

froce iT邦大師 1 級 ‧ 2018-09-13 20:56:06 檢舉

常寫就會想到了,因為這樣寫絕對比你那種寫法還來的快...
python的for迴圈其實蠻耗資源的。

我要發表回答

立即登入回答