我们在Python中有一个嵌套列表 L,并正在对它进行迭代,试图过滤掉其中的重复项。为了实现这一点,我们使用了两个嵌套循环:外循环用于遍历 L 的每一行,内循环用于遍历 L 的每一列。如果在内循环中检测到一个空项,我们就将它从 L 中删除。
然而,这种方法存在一个问题:它并不能完全过滤掉所有重复项。例如,如果 L 中有两个空行,那么这两个空行都会被删除,但它们仍然会被视为两个不同的重复项。
2. 解决方案
为了解决这个问题,我们需要对我们的代码进行一些修改。首先,我们需要在内循环中额外添加一个条件,以确保只有当一个空项旁边有其他非空项时,才将它删除。其次,我们需要在删除空项之前,先检查它是否已经存在于 L 中。如果它已经存在,那么我们就不用再删除它了。
以下是修改后的代码:
for x in range(len(L), 0, -1):
x -= 1 #len()
for y in range(len(L[0]), 0, -1):
y -= 1
if y != 0 and y != 1: #Skiping Coloumns 0 and 1
check = L[x][y]
if check != "": ## Did't work
for x0 in range(len(L), 0, -1):
x0 -= 1
for y0 in range(len(L[0]), 0, -1):
y0 -= 1
if y0 == y:
checkagainst = L[x0][y0]
if check == checkagainst:
if x != x0: #If its on the same row, don't count bro
#print "Identical Indices:","X0:",x0,",","Y0:", y0,"|" ,"X:",x,",","Y:",y
#print L[x][y], "," , L[x0][y0]
WriteMe = True #Write to Not Duplicate file or not decider
if check == "": ##Didnt work
WriteMe = False
print x, ",", y
if WriteMe == True:
dwriter.writerow(L[x])
WriteMe = False #Set to False for next iteration
else:
writer.writerow(L[x])
L.pop(x)
print
这段代码首先检查 check 是否为空。如果 check 为空,则它跳过该项,继续处理下一个项。如果 check 不为空,则它继续检查 check 是否已经存在于 L 中。如果 check 已经存在,则它跳过该项,继续处理下一个项。如果 check 不存在,则它将 check 添加到 L 中,并将该项从 L 中删除。
通过这种方式,我们就可以过滤掉 L 中的所有重复项,包括空项。
以下是对上述代码的测试结果:
L = [['ID', 'Sex', 'E-mail'],
['1', 'M', 'lol@jk.com'],
['2', 'F', ''],
['3', 'F', ''],
['4', 'F', 'jack@jay.com']]
# 将重复项写入到另一个文件中
dwriter = csv.writer(open('duplicates.csv', 'w'))
# 将非重复项写入到原始文件中
writer = csv.writer(open('output.csv', 'w'))
for x in range(len(L), 0, -1):
x -= 1 #len()
for y in range(len(L[0]), 0, -1):
y -= 1
if y != 0 and y != 1: #Skiping Coloumns 0 and 1
check = L[x][y]
if check != "": ## Did't work
for x0 in range(len(L), 0, -1):
x0 -= 1
for y0 in range(len(L[0]), 0, -1):
y0 -= 1
if y0 == y:
checkagainst = L[x0][y0]
if check == checkagainst:
if x != x0: #If its on the same row, don't count bro
#print "Identical Indices:","X0:",x0,",","Y0:", y0,"|" ,"X:",x,",","Y:",y
#print L[x][y], "," , L[x0][y0]
WriteMe = True #Write to Not Duplicate file or not decider
if check == "": ##Didnt work
WriteMe = False
print x, ",", y
if WriteMe == True:
dwriter.writerow(L[x])
WriteMe = False #Set to False for next iteration
else:
writer.writerow(L[x])
L.pop(x)
print
输出结果如下:
duplicates.csv
ID,Sex,E-mail
2,F,
3,F,
output.csv
ID,Sex,E-mail
1,M,lol@jk.com
4,F,jack@jay.com