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

2024-06-01 08:20:19 发布

您现在位置:Python中文网/ 问答频道 /正文

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

最奇怪的是“唯一对象的数目”是正确的,但最后创建的唯一对象列表却是错误的。有谁能指出我哪里出了问题吗?在

我感兴趣的列是“Object”,唯一列表应该包含猫头鹰狐狸山羊蚂蚁水牛狮子老虎。在

样本数据:

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

我的工作代码如下:

^{pr2}$

我在这最后得到的是复制品,包括2只狐狸,还缺少一些独特的条目。当然,这只是一个虚拟数据,但我希望我能清楚地解释到底发生了什么。在

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

Gridiron
Cricket
Ping Pong Table
Softball

更新2:

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

谢谢


Tags: 数据对象列表object错误pingnullpong
3条回答

^{}不是就地方法,它返回剥离字符串。您需要将其分配回object-

object = object.lstrip(' ')

假设Python2.7+(或3.1+),一种更快的方法是使用set,也许{}。示例-

^{pr2}$

请注意,这不会保留任何顺序,因为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示例-

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中的列表来创建一个集合,然后迭代这些列表的内容。更详细的方法:

^{pr2}$

这可以实现几乎相同的功能,可能是以更容易理解的格式实现的。另外,请注意,我使用-1来切片到csv中的最后一列。在

像这样编辑代码:

for object in row[5].split(','):
        object=object.strip()
        if object not in unique:
            unique.append(object)

剥离将删除右侧和左边。还有将对象指定为新对象

^{pr2}$

相关问题 更多 >