Python TypeError:不可用类型:使用从CSV和SET生成的列表的'list'

时间:2014-12-23 09:04:53

标签: python csv set

我很困惑。

我有一个名为qualified []的列表,来自csv:

with open('C:\emp.csv', newline='') as f:
    eligible = []
    reader = csv.reader(f)
    for row in reader:
        eligible.append(row)

我正在尝试创建一个新列表,删除在常规for循环中创建的重复项。

我输入了两者,它们显示为'列表'

尝试使用set:

删除重复项时出现此错误
new_eligible = list(set(small)^set(eligible))
TypeError: unhashable type: 'list'

我试图将它们变成'套'但它给了我一个错误。

2 个答案:

答案 0 :(得分:0)

eligible列表:即它是一个行列表,每行本身就是一个列表。由于元素本身就是列表,因此无法对它们进行哈希处理,因此无法将整个列表转换为列表。

很难理解你在这里要做的事情:你是否想要过滤掉符合small列表的符合条件的任何行?在这种情况下,您需要在将它们添加到列表之前对它们进行比较:

small_set = set(small)
with open('C:\emp.csv', newline='') as f:
    eligible = []
    reader = csv.reader(f)
    for row in reader:
        if set(eligible) != small_set:
            eligible.append(row)

答案 1 :(得分:0)

正如大脑们已经指出的那样,你得到的错误是因为eligible是一个列表,其元素是列表。这是因为csv.reader中的每一行都是与每条逻辑行上读取的逗号分隔值对应的列表。

一个简单的解决方法是将每个返回的行转换为tuple,然后再将其附加到eligible。这是因为元组可以设置元素。您还可以使用称为列表理解的表达式来更紧凑地创建它:

with open('emp.csv', newline='') as f:
    eligible = [tuple(row) for row in csv.reader(f)]

您需要其他不想复制的内容列表,其中还包含tuples元素。您可以更改其创建方式,也可以将其转换为:

small_set = set(tuple(elem) for elem in small)

最后,要创建一个在另一个元素中没有任何元素的新列表,我认为你应该使用常规集合差异运算符-,而不是对称差异运算符{{1 }}:

^