[英]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.