Python中不工作的对象的唯一列表

Python中不工作的对象的唯一列表,python,list,for-loop,Python,List,For Loop,我试图使用Python创建一个唯一的对象列表,但失败了。无论我使用列表还是集合,它似乎都不起作用。当我打印列表/集合时,我注意到列表中有几个非唯一的对象。我意识到是这样的,因为其中一些物体在单词的开头有一个“空格”。我环顾四周,认为使用··lstrip(“”)·将有助于我的事业,但遗憾的是它没有 最奇怪的是“唯一对象的数量”是正确的,但最后创建的唯一对象列表是错误的。谁能告诉我哪里出了问题 我感兴趣的专栏是“对象”,唯一的列表应该包括猫头鹰、猫、狐狸、牛、山羊、狗、蚂蚁、水牛、狮子和老虎 样本数

我试图使用Python创建一个唯一的对象列表,但失败了。无论我使用列表还是集合,它似乎都不起作用。当我打印列表/集合时,我注意到列表中有几个非唯一的对象。我意识到是这样的,因为其中一些物体在单词的开头有一个“空格”。我环顾四周,认为使用··lstrip(“”)·将有助于我的事业,但遗憾的是它没有

最奇怪的是“唯一对象的数量”是正确的,但最后创建的唯一对象列表是错误的。谁能告诉我哪里出了问题

我感兴趣的专栏是“对象”,唯一的列表应该包括猫头鹰、猫、狐狸、牛、山羊、狗、蚂蚁、水牛、狮子和老虎

样本数据:

Key    ID    Name    Code    State    Object
01     NULL  NULL   NULL    NULL      Athletics, Light,Netball
02     NULL  NULL   NULL    NULL      BMX Track, Gridiron, Oval
05     NULL  NULL   NULL    NULL      Dog park, Cricket, Soccer
10     NULL  NULL   NULL    NULL      Netball, Oval, Softball
21     NULL  NULL   NULL    NULL      Seat, Playground, Ping Pong Table
13     NULL  NULL   NULL    NULL      Bench, Bike Rack, Seat
我的工作代码附在下面:

import csv

fOpen1=open('C:\Data.csv')
uniqueList=csv.writer(open('C:\UniqueList.csv', 'wb'))

Master=csv.reader(fOpen1)
Master.next()

unique=[]

for row in Master:
    for item in row[5].split(','):
        item.strip(' ')
        if item not in unique:
            unique.append(item)
uniqueList.writerow(unique)
最后我得到的是重复的,包括2只狐狸,还缺少一些独特的条目。当然,这只是虚拟数据,但我希望我能清楚地解释发生了什么

更新1: 我已经更新了脚本,它可以正常工作,但是出现了另一个问题。我已经用我正在使用的真实数据更新了专栏。未添加到最终列表的唯一项包括:

Gridiron
Cricket
Ping Pong Table
Softball
更新2:

我已经恢复到原来的“错误”脚本,因为它现在可以正常工作了。我正在处理的csv文件有问题

谢谢,

不是就地方法,它返回剥离的字符串。您需要将其分配回
对象
-

object = object.lstrip(' ')
假设Python2.7+(或3.1+),更快的方法是使用
set
,或者
set-comprehension
。范例-

unique = {obj.lstrip() for row in Master for obj in row[5].split(',')}
uniqueList.writerow(list(unique))
unique=[]
seen_set = set()
for row in Master:
    for obj in row[5].split(','):
        obj = obj.lstrip(' ')
        if obj not in seen_set:
            unique.append(obj)
            seen_set.add(obj)
请注意,这不会保留任何顺序,因为
set
s没有顺序。如果顺序很重要,您可以使用
设置
来存储已经看到的值。范例-

unique = {obj.lstrip() for row in Master for obj in row[5].split(',')}
uniqueList.writerow(list(unique))
unique=[]
seen_set = set()
for row in Master:
    for obj in row[5].split(','):
        obj = obj.lstrip(' ')
        if obj not in seen_set:
            unique.append(obj)
            seen_set.add(obj)
此外,我还建议您不要将
对象
用作变量名,因为这是内置类(由所有其他类扩展)的名称


另外,似乎有一些字符串结尾带有空格,因此最好使用
.strip()
.strip(“”)
而不是
.lstrip(“”)
。带集合理解的
条带
示例-

unique = {obj.strip() for row in Master for obj in row[5].split(',')}
uniqueList.writerow(list(unique))

一套理解方法对你很有用

首先,让我们使用上下文管理器除去打开的文件:

import csv

with open('C:\Data.csv') as raw:
    master = csv.reader(raw)
    master.next()  # Ignore the header
    unique = {y.strip() for row in master for y in row[-1].split(',')}
好的,让我们看看我们在那里做了什么。我们使用上下文管理器打开了该文件,因此该文件将自动关闭。然后我们使用csv.reader读取csv,并迭代通过第一行

这里是它变得棘手的地方-我们通过迭代csv中的列表,然后迭代这些列表的内容来创建一个集合。更详细的方式:

unique = set()
for row in master:
    for item in row[-1].split(','):
        unique.add(item.strip())

这可能以一种更容易理解的格式完成了大致相同的事情。另外,请注意,我使用了-1来切分到csv中的最后一列。

编辑您的代码,如下所示:

for object in row[5].split(','):
        object=object.strip()
        if object not in unique:
            unique.append(object)
条带将删除左右两侧的所有空格,并将对象指定为新对象

object = object .strip()  

@阿南德斯库玛-感谢您的洞察力。不过现在我手头还有另一个问题。虽然我已经去掉了尾随空格,但在我的最终列表中唯一条目的数量是不完整的。在我正在处理的文件中,有30个唯一的条目。按照建议进行更改后,已降至21。知道这里发生了什么吗?再次感谢您!您是否检查过缺少哪些特定条目?他们似乎有什么联系吗?可能它们不在
对象
字段中?@AnandSKumar-我手动检查,看不到缺失条目之间的一般链接,即没有连接。当我检查正在处理的源文件时,它们肯定都在Object字段中。这是令人困惑的。你能在问题中举例说明csv行以及缺少的条目吗。csv选项卡是否有分隔符?如果是这样的话,您是否以tab作为分隔符打开csv文件?