我很困惑。
我有一个名为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'
我试图将它们变成'套'但它给了我一个错误。
答案 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 }}:
^