簡體   English   中英

Python:類型錯誤:不可散列類型:'切片'

[英]Python: TypeError: unhashable type: 'slice'

我正在使用 python 讀取 CSV,這是代碼。

train_csv = open('train.csv')
test_csv = open('test.csv')
train_data_reader = csv.DictReader(train_csv)
test_data_reader = csv.DictReader(test_csv)

row=[]
for row in train_data_reader:
    X.append([int(item) for item in row[4:]]) 
    char = row[1]
    Y.append(charIntConversion(char))
    train_id.append(row[0])
    prediction.append(row[1])
for row in test_data_reader:
    test_id.append(row[0])
    test_X.append([int(item) for item in row[4:]]

當我嘗試運行代碼時,它顯示 TypeError: unhashable type: 'slice' for

X.append([int(item) for item in row[4:]])
test_X.append([int(item) for item in row[4:]] 

X 和 test_X 應包含從第 4 列到 CSV 的最后一列的值。

我可以知道我的代碼有什么問題,我該如何解決這個問題?

我可以看到您已經解決了您的問題,但我想我會在這里為任何未來的讀者留下答案。 誰可能會被這個抓住(我就是這樣)。

問題是該對象是一個字典,而您正試圖向它傳遞一個切片,該切片不可散列,因此不能用作 dict 鍵。

簡單的例子

>>> d = {0: 5, 1: 6, 2: 7, 3: 8, 4: 9}
>>> d[:5]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'slice'

您要做的是從集合中取出n項目。 所以實現這一點的方法是首先將 dict 轉換為列表(這是可切片的)。 要做到這一點使用dict.itemsdict.keysdict.values取決於你的使用情況。

dict(盡管最近的python 3.6開發)沒有排序,所以你從dict.items (或朋友)得到的東西可能對你沒有用。 所以你可以在切片之前對它進行排序。

>>> sorted(d.items())[:5]
[(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]

上面的代碼有點難看,但有效。

您可以通過使用 itertools 中的islice來避免索引

>>> from itertools import islice
>>> list(islice(sorted(d.items()), 5))
[(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]

如果默認排序順序不是您想要的,您將提供一個排序鍵。 這種方式效率低下,因為它在切片之前對整個集合進行排序,但不確定是否有解決方法。

任何到達此頁面並對上述錯誤感到困惑的人都不會意識到他們正在嘗試對字典進行切片。 在字典上執行切片並沒有多大意義,大多數有經驗的開發人員會意識到,如果你這樣做,你會要求一個不可預測的結果。

如果您真的想從字典中獲取前 n 個元素,請說 csv 文件中的一行,其中列按某種規定的順序排列。 將所需的鍵格式化為元組並從字典中獲取這些元素會更好。

例如

只從字典中取出前兩列

people = [{'name': 'paul', 'job': 'programmer', 'age': 'old'}, 
          {'name': 'chris', 'job': 'student', 'age': 'young'}]

>>> for p in people:
...     res = [p[key] for key in ('name', 'job')]
...     print(res)
['paul', 'programmer']
['chris', 'student']

多元線性回歸模型的編碼器示例

# Importing the dataset
dataset = pd.read_csv('Data.csv')
X = dataset.iloc[:, 0:4].values
y = dataset.iloc[:,4].values

# Encoding categorical data
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
labelencoder_X = LabelEncoder()
X[:, 3] = labelencoder_X.fit_transform(X[:, 3])
onehotencoder = OneHotEncoder(categorical_features = [3])
X = onehotencoder.fit_transform(X).toarray()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM