2015-09-29 50 views
3

我想創建一個使用Python的對象的唯一列表,我失敗了。無論我使用列表還是使用集合都無關緊要,它似乎不起作用。當我打印列表/集時,我注意到列表中有幾個非唯一對象。我意識到是這樣的,因爲其中一些對象在詞的開頭有一個「空格」。我環顧四周,並認爲使用lstrip('')會幫助我的事業,但可悲的是事實並非如此。Python中的對象的唯一列表不工作

最奇怪的是「唯一對象的數量」是正確的,但最終創建的唯一對象的列表是錯誤的。任何人都可以請指出我哪裏錯了?

我感興趣的列是 '對象' 和獨特的列表應包含貓頭鷹福克斯山羊螞蟻BuffaloLion and 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文件有問題。

由於

回答

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 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)) 
+0

@ AnandSKumar-感謝您的見解。但是現在我又遇到了另一個問題。雖然我已經擺脫了尾隨空格,但最終列表中的唯一條目數量並不完整。在我正在處理的文件中,有30個唯一條目。按照建議進行修改後,結果已經降到21.任何想法可能會發生在這裏?再一次感謝你! – VGu

+0

您是否檢查瞭解哪些特定條目缺失?他們似乎有任何聯繫?也許他們不在'Object'字段中? –

+0

@ AnandSKumar-我手動檢查,無法看到缺少的條目之間的一般鏈接,即沒有連接說。當我檢查我正在處理的源文件時,它們都在Object字段中。這令人迷惑。 – VGu

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

2

編輯你的代碼是這樣的:

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

條會從右刪除所有空格和left.and分配對象爲新對象

object = object .strip()