【问题标题】:Python: TypeError: unhashable type: 'slice'Python:TypeError:不可散列的类型:'sl​​ice'
【发布时间】:2017-03-19 10:26:19
【问题描述】:

我正在使用 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 应包含 CSV 的第 4 列到最后一列的值。

我可以知道我的代码有什么问题吗?我该如何解决这个问题?

【问题讨论】:

  • 您确定row 是一个列表吗?好像它可能是一本字典。确实,鉴于您专门使用 DictReader,完全不清楚您为什么会这么想。
  • 我正在使用 DictReader 因为我想跳过第一行。但我没有意识到它是字典而不是列表。我已经修改了我的代码并解决了这个问题。非常感谢!

标签: python csv


【解决方案1】:

我可以看到您已经解决了您的问题,但我想我会在这里为任何未来的读者留下答案。谁可能会被这个抓住(我只是)。

问题是该对象是一个字典,而您正试图向它传递一个切片,该切片不可散列,因此不能用作字典键。

简单示例

>>> 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

字典(尽管最近有 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']

【讨论】:

    【解决方案2】:

    多元线性回归模型的编码器示例

    # 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()
    

    【讨论】:

      猜你喜欢
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 2021-08-15
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多