Python将列表与要检查重复项的列表列表进行比较

时间:2014-05-22 02:10:40

标签: python list csv

我正在尝试通过加载CSV文件来更新它,然后根据现有的列表列表进行检查。使用csv.reader:

读取数据
[["Name","URL","Team"],["Name","URL","Team"]] 

我有另一个列表,列表格式相同:

[["Name","URL","Team"],["Name","URL","Team"]] 

我的目标是只添加CSV文件中尚不存在的内容(第一个列表列表)。我尝试了以下内容,但它不起作用:

reader = csv.reader(file)
fantasyList = [["Name","URL","Team"],["Name","URL","Team"]] 

new_list = []

for elem in reader:
    if elem not in new_list:
        new_list.append(elem)

for elem in fantasyList:
    if elem not in new_list:
        new_list.append(elem)

那么如何将列表列表中的列表添加到单独的列表列表中而不重复条目?

**

以下澄清

**

这是我的问题:

我有一份清单清单。这是一个包含列表的列表。这是一个例子:

[["Bob the Builder", "Google", "Free Breakfast"],
["I down vote because I'm better than you", "Actually dude, your question kinda blows. Just clean it up and we'll upvote it.", "Is this better? because I Dunno LOL ¯\(°_o)/¯"]]

如果还不够清楚,请查看data structures以获得有关python中“list”的更好解释。现在您已了解列表的内容,想象一下将列表放在另一个列表中,然后通过向主列表添加更多列表来重复该过程。你最终会得到一个“列表清单。”

现在假设我有一个CSV file我要加载到我的python程序中。这样做的简单方法是使用csv模块。这是CSV module documentation。以下是如何加载CSV文件的示例:

import csv

f = open(r'foo/bar.csv', 'a+')

reader = csv.reader(f)

因此,上面的代码演示了如何将CSV加载为reader对象。以下是如何迭代CSV行的示例:

import csv

f = open(r'foo/bar.csv', 'r')

reader = csv.reader(f)

for row in reader:
     print row

以上说明了如何打印CSV的所有行。所以现在想象一下有三列的CSV。使用csv模块加载CSV时,您将获得一个reader对象。假设您要通过添加尚不存在的行来更新此CSV。我们不想在CSV文件中创建重复条目。所以,让我们继续看看理论上应该做些什么:

import csv

f = open(r'foo/bar.csv', 'r')
#initialize a temporary list to transfer the CSV contents to 
tempList = []

#initialize the final list to be saved to the CSV
finalList =[]

reader = csv.reader(f)

for row in reader:
     tempList.append(row)

#close the file to avoid read/write errors
f.close()

好的,好的。现在我们的tempList应该是“列表列表”(参见上面的示例),它代表CSV每行的三列。现在让我们看看我们想要加入tempList的其他“列表列表”:

fantasyList = [["Pushing Will Protect You","Shoving Will Protect you", "Do you have stairs in your house?"],["Pak","Chooi","Unf"]]

如您所见,上面演示了“列表清单”。现在考虑以下代码:

#For each list in tempList, check if it exists in the final list

for elem in tempList:
    if elem not in finalList:
        finalList.append(elem)

for elem in fantasyList:
    if elem not in finalList:
        finalList.append(elem)

上述代码不应在finalList中创建任何重复的条目。例如,假设tempList包含列表["Pak","Chooi","Unf"]。现在我们可以说fantasyList也包含["Pak","Chooi","Unf"]。运行上述操作后,finalList不应包含两个["Pak","Chooi","Unf"]条目。因此,更新我们的CSV的最后一步是将finalList写入文件:

f = open(r'foo/bar.csv', 'w')

wr = csv.writer(f, dialect='excel')

wr.writerows(finalList)

f.close()

但这就是我的问题:我在我的CSV中找到了重复的条目。无论出于何种原因,我无法弄清楚这里有什么不起作用。

1 个答案:

答案 0 :(得分:1)

我不知道你的代码存在什么问题,因为你提供的代码片段并不清楚。

但是,这是您的问题的替代解决方案。创建一个set(),它将强制执行项目的唯一性。这样,添加什么并不重要,只有唯一的东西才会被添加到主集中。

这是一个小例子:

>>> first = [['a','b','c'],['d','e','f']]
>>> second = [['a','b','c'],['d','e','f'],[1,2,3],['g','h','i']]
>>> master = set(tuple(i) for i in first)
>>> master.update((tuple(i) for i in second))
>>> list(master)
[('g', 'h', 'i'), ('a', 'b', 'c'), ('d', 'e', 'f'), (1, 2, 3)]

您可能已经注意到,套装没有订购;如果这成为问题,您可以随后通过将其转换为列表然后在其上运行sorted来订购该集。

您可能已经注意到的第二件事是您最终得到了一个元组列表(集合只能包含可混合类型)。如果您所做的只是将组合文件写回来,这将不会产生太大影响。

另一种方法是使用列表推导:

>>> master = [i for i in second if i not in first] + first
>>> master
[[1, 2, 3], ['g', 'h', 'i'], ['a', 'b', 'c'], ['d', 'e', 'f']]