2016-05-23 160 views
0

我目前正在Udacity上進行數據分析課程。我有點困難。我有我正在嘗試轉換一些字典中的一些數據類型,我不斷收到錯誤「TypeError:列表索引必須是整數,而不是str」現在,它說這是一個列表,但從我的理解,我所有的數據是在一個字典。這是代碼。Python 2.7中的「TypeError:列表索引必須是整數,而不是str」

# Lesson 1 - Data Analysis 
# Get & Open Data 
import unicodecsv 
import datetime as dt 

def openCSV(filename): 
    with open(filename, "rb") as f: 
     reader = unicodecsv.DictReader(f) 
     return list(reader) 

def parse_date(date): 
    if date == '': 
     return None 
    else: 
     return dt.strptime(date, "%y-%m-%d") 
def parse_int(i): 
    if i == '': 
     return None 
    else: 
     return int(i) 

enrollments = openCSV("enrollments.csv") 

for enrollment in enrollments: 
    enrollments['cancel_date'] = parse_date(enrollments['cancel_date']) 
    enrollments['days_to_cancel'] = parse_int(enrollments['days_to_cancel']) 
    enrollments['is_canceled'] = enrollments['is_canceled'] == 'True' 
    enrollments['is_udacity'] = enrollments['is_udacity'] == 'True' 
    enrollments['join_date'] = parse_date(enrollments['join_date']) 

# daily_engagement = openCSV("daily_engagement.csv") 
# project_submissions = openCSV("project_submissions.csv") 

enrollments[0] 

下面是該文件的內容的一個樣本,它的前兩行:

account_key,status,join_date,cancel_date,days_to_cancel,is_udacity,is_canceled 
448,canceled,2014-11-10,2015-01-14,65,True,True 
+0

'openCSV'的最後一行將您的數據轉換爲列表,不是嗎?嘗試只是返回'reader' –

+0

我認爲行'reader = unicodecsv.DictReader(f)'將數據轉換爲字典。主要是因爲您無法使用字符串訪問列表中的項目。 @SimonFraser –

+0

在for循環中,您通過迭代登記來獲得註冊,但您嘗試訪問Enrolements鍵而不是註冊鍵 –

回答

2
在for循環中,您可以通過迭代的入學率得到入學

,但您嘗試訪問招生鍵而不是入學鍵

for enrollment in enrollments: 
    enrollment['cancel_date'] = parse_date(enrollment['cancel_date']) 
    enrollment['days_to_cancel'] = parse_int(enrollment['days_to_cancel']) 
    enrollment['is_canceled'] = enrollment['is_canceled'] == 'True' 
    enrollment['is_udacity'] = enrollment['is_udacity'] == 'True' 
    enrollment['join_date'] = parse_date(enrollment['join_date']) 

此外,您的輔助功能可以簡化爲:

def parse_date(date): 
    return dt.strptime(date, "%y-%m-%d") if date else None 

def parse_int(i): 
    return int(i) if i else None 
+0

所以,我改變它,所以它返回一個字典,而不是一個列表,並使用上面的代碼。但我得到一個新的錯誤。 ValueError:字典更新序列元素#0的長度爲7; 2是必需的 –

+0

不會改變你建立註冊的方式,只需刪除「s」就像我做的那樣 –

+0

我也試過,它給了我同樣的錯誤,我開始,TypeError:列表索引必須是整數,而不是str。 –

-1

您有一個錯字。它應該是enrolment['cancel_date']而不是enrolments['cancel_date']

相關問題