我正在尝试使用Python创建一个唯一的对象列表,但我失败了。无论我使用列表还是集合都没关系,它似乎不起作用。当我打印列表/集时,我注意到列表中有几个非唯一对象。我意识到情况就是这样,因为其中一些对象在单词的开头有一个“空格”。我环顾四周,想着使用·lstrip('')来帮助我的事业,但遗憾的是没有。
最奇怪的是'唯一对象的数量'是正确的,但最后创建的唯一对象列表是错误的。任何人都可以指出我哪里出错了?
我感兴趣的专栏是'对象',唯一列表应该包含猫头鹰,猫, Fox ,牛,山羊,狗, Ant , Buffalo ,狮子和 tiger 。
示例数据:
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只狐狸,也缺少一些独特的条目。当然这只是虚拟数据,但我希望我能清楚地解释发生了什么。
UPDATE1: 我已经更新了脚本,它可以正常工作但是又出现了另一个问题。我已经使用我正在使用的真实数据更新了该列。未添加到最终列表的唯一项目包括:
Gridiron
Cricket
Ping Pong Table
Softball
UPDATE2:
我已经恢复原来的'错误'脚本,因为它现在可以正常工作了。我正在处理的csv文件出了问题。
由于
答案 0 :(得分:4)
str.lstrip(' ')
不是就地方法,它返回剥离的字符串。您需要将其分配回object
-
object = object.lstrip(' ')
假设Python 2.7+(或3.1+),更快的方法是使用set
,也许set comprehension
。示例 -
unique = {obj.lstrip() for row in Master for obj in row[5].split(',')}
uniqueList.writerow(list(unique))
请注意,这不会保留任何订单,因为set
未订购。如果订单很重要,您可以使用set
来存储已经看到的值。示例 -
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)
另外,我建议您不要将object
用作变量名,因为这是内置类的名称(由所有其他类扩展)。
此外,似乎最后有一些带有空格的字符串,因此最好使用.strip()
或.strip(' ')
而不是.lstrip(' ')
。带有集合理解的strip
示例 -
unique = {obj.strip() for row in Master for obj in row[5].split(',')}
uniqueList.writerow(list(unique))
答案 1 :(得分:2)
编辑你喜欢的代码:
for object in row[5].split(','):
object=object.strip()
if object not in unique:
unique.append(object)
strip将从右侧和左侧删除所有空格。并将对象指定为新对象
object = object .strip()
答案 2 :(得分:1)
理解能力很好。
首先,让我们使用上下文管理器删除该打开的文件:
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中的最后一列。