2016-10-28 90 views
-1

我得到這個錯誤以下代碼Unhashable類型:「名單」錯誤

def cleaning(CURRENT,STRING,NEXT): 
    data.ix[data[NEXT].str.contains(STRING,na=False),CURRENT] =... 
    data[NEXT][data[NEXT].str.contains(STRING,na=False)] 
d = ['lower','Less'] 
c = a[5:] 
for x,y in zip(range(len(c)),d): 
    cleaning(c[x],d,c[x+1]) 
    cleaning(c[x],d,c[x+2]) 

這裏,數據是數據框大熊貓。 然而,對於同樣的功能,我沒有得到錯誤在下面的代碼

a = ['UBC','LBC', 'HC', 'FC', 'P:C/F','P', 'A', 'Sex'] 
b = ['upper','lower','hair','footwear'] 
for x,y in zip(range(len(a)),b): 
    cleaning(a[x],y,a[x+1]) 
    cleaning(a[x],y,a[x+2]) 

我知道這是因爲我們不能用一個列表作爲一個字典的關鍵,但我不知道怎麼發生的事情在這裏,爲什麼它是爲一個循環而不是另一個循環工作的。

+1

您正在傳遞'd'作爲'STRING'參數列表。你的意思是代替傳入'y'嗎? –

+0

另外,什麼是'a'?如果'a'是一個列表列表,那麼'c [']'是一個列表,然後以'NEXT'的形式傳入。 –

+0

請確認您的例外包含**完整追溯**。我有一種預感,我剛剛證實了這一點,但追溯會使這一點變得更加清晰。 –

回答

1

您傳遞d,列表,作爲STRING參數:

d = ['lower','Less'] 
# ... 
    cleaning(c[x],d,c[x+1]) 
    #   ^

你的第二個示例工作,你在y票代替,這是從b列表中的單個元素:

b = ['upper','lower','hair','footwear'] 
for x,y in zip(range(len(a)),b): 
    #^one element from b ^
    cleaning(a[x],y,a[x+1]) 
    #   ^

pandas.Series.str.contains方法默認接受正則表達式,而re.compile使用字典作爲緩存來保存編譯的模式。因爲你在列表中過去了,你得到你的錯誤:

>>> pandas.Series(['aa', 'bb', 'cc']).str.contains(['a']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/pandas/core/strings.py", line 1458, in contains 
    regex=regex) 
    File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/site-packages/pandas/core/strings.py", line 222, in str_contains 
    regex = re.compile(pat, flags=flags) 
    File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 194, in compile 
    return _compile(pattern, flags) 
    File "/Users/mjpieters/Development/venvs/stackoverflow-2.7/lib/python2.7/re.py", line 237, in _compile 
    p, loc = _cache[cachekey] 
TypeError: unhashable type: 'list' 

解決方法是在y而不是d經過:

for x, y in zip(range(len(c)) ,d): 
    cleaning(c[x], y, c[x + 1]) 
    cleaning(c[x], y, c[x + 2]) 

您可能要拿出更好的變量名;一個字母的名字很難區分,容易導致類似的錯誤。

+0

啊,多麼愚蠢的事情!謝謝,我會記住這一點。 –