簡體   English   中英

Python中唯一的對象列表無法正常工作

[英]Unique list of objects in Python not working

我試圖使用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

UPDATE2:

我已經恢復到原來的'錯誤'腳本,因為它現在可以正常工作了。 我正在處理的csv文件有問題。

謝謝

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 s的不排序。 如果訂單很重要,您可以使用一個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))

編輯你的代碼是這樣的:

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

strip將從右側和左側刪除所有空格。並將對象分配為新對象as

object = object .strip()  

一套理解能為你服務。

首先,讓我們使用上下文管理器刪除該打開的文件:

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中的最后一列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM