2016-12-14 51 views
1

我有一份列表,我想把它製作成字典。基本上它是基於日期(年/月/日/星期/出生)的分娩清單。我想根據每天的總分娩數來總共查看一週中每天的分娩數。如何從每個列表中的2個元素中創建字典?

列表例如:

[2000,12,3,2,12000],[2000,12,4,3,34000]... 


days_counts = {1: 23000, 2: 43000, ..., 7: 11943} 

這裏是到目前爲止的代碼:

f = open('births.csv', 'r') 
text = f.read() 
text = text.split("\n") 
header = text[0] 
data = text[1:] 
for d in data: 
    split_data = d.split(",") 
    print(split_data) 

所以基本上我想遍歷的每一天,從重複的日子添加誕生到相同的密鑰(obviusly) 。

編輯:我必須做一個if語句,查找星期幾作爲字典中的鍵。如果找到,則將相應的出生分配爲值。如果它不在字典中,則添加鍵和值。我無法導入任何內容或使用lambda函數。

+0

你應該閱讀有關['with'聲明】(https://www.python.org/dev/peps/pep-0343 /) – wpercy

回答

0

好,用打轉轉之後代碼和使用打印語句,我需要他們進行測試,我最終沒有使用任何外部庫。對託比和其他人非常特別的感謝。

下面是與測試的代碼:

f = open('births.csv', 'r') 
text = f.read() 
text = text.split("\n") 
header = text[0] 
data = text[1:-1] 
days_counts = {} 
for d in data: 
    r = d.split(",") 
    print(r) #<--- used to test 
    k = r[3] 
    print(k)#<--- used to test 
    v = int(r[4]) 
    print(v)#<--- used to test 
    if k in days_counts: 
     days_counts[k] += v 
     print("If : " , days_counts)#<--- used to test 
    else: 
     days_counts[k] = v 
     print("Else : ", days_counts)#<--- used to test 


print(days_counts)  

代碼而不進行測試:

f = open('births.csv', 'r') 
text = f.read() 
text = text.split("\n") 
header = text[0] 
data = text[1:-1] 
days_counts = {} 
for d in data: 
    r = d.split(",") 
    k = r[3] 
    v = int(r[4]) 
    if k in days_counts: 
     days_counts[k] += v 
    else: 
     days_counts[k] = v 

print(days_counts)  
4

使用collections.Counter() object可以跟蹤每週的每日計數。你也想用csv module處理文件解析:

import csv 
from collections import Counter 

per_dow = Counter() 

with open('births.csv', 'r') as f: 
    reader = csv.reader(f) 
    header = next(reader) 
    for row in reader: 
     dow, births = map(int, row[-2:]) 
     per_dow[dow] += births 

我已經使用了with語句來管理文件對象;當with塊結束時,Python自動關閉文件。

現在你有一個Counter對象(這是一個有額外權力的字典),你現在可以找到一週中出生次數最多的一天;下面的循環打印出星期幾,以從多到少:

for day, births in per_dow.most_common(): 
    print(day, births) 
+0

'map(int,row [-2:])'返回一個元組? – pylang

+0

@pylang:不,但可迭代賦值不需要元組,它需要一個迭代。 –

+0

我看到,你的切片解包成兩個變量。謝謝。 – pylang

1

不使用外部庫或if語句,你可以使用異常處理

birth_dict = {} 
birth_list = [[2000,12,3,2,12000],[2000,12,4,3,34000]] 
for birth in birth_list: 
    try: 
     birth_dict[birth[3]]+=birth[4] 
    except KeyError: 
     birth_dict[birth[3]]=birth[4] 
print birth_dict 
+0

這一個幫了很多..謝謝託比:) –

+0

很酷。你應該接受你使用的答案。 – Tobey

相關問題