2017-06-20 129 views
-1

我希望創建一個程序,我會希望做更多的尋找確切性或更少的以下內容:一組蟒蛇

  1. 讀取來自多個CSV文件大學的名單
  2. 檢查是否我們已經存儲的名稱(即是唯一的)
  3. 如果已經存儲,繼續前進,否則就追加到一個列表

我要的是所有的特色的大學名稱的列表我們到目前爲止(在這一點上噸,縮寫對我來說不重要),但總計名稱的列表非常大。由於python集具有非常快速的查找時間,因此我在考慮首先檢查名稱是否在集合中,如果不是,則將該名稱附加到唯一列表和集合(我還需要列表,因爲訂單事宜)。當你檢查某個集合中是否有「in」時,那個「in」命令就像檢查一個字符串是否在一個更大的字符串中一樣?換句話說,在字符串比較中,「阿拉巴馬大學 - 伯明翰大學」中的「阿拉巴馬大學」返回True。在集合比較中,如果我測試以查看「阿拉巴馬大學」是否在集合中,但是僅添加了「阿拉巴馬大學 - 伯明翰大學」,它會返回true嗎?如果是的話,有沒有辦法測試是否添加了EXACT字符串「阿拉巴馬大學」而不是其他包含「阿拉巴馬大學」的字符串?

+0

'set'的行爲不像'str' - 它在使用'in'比較時表現得像一個列表,即它只能用於精確匹配,沒有子字符串/子列表。 – zwer

+0

@zwer好的,謝謝 – mgrogger

+0

我想知道爲什麼你不使用'OrderedDict'?另外,如果你很懷疑爲什麼不通過他們的ID比較字符串? –

回答

2

要解決您的第一個問題,您可以查看OrderedSet。有一個recipe這是從Python 2 Documentation引用。這可以在Py2.6或更高版本以及3.0或更高版本上運行,無需任何修改。該接口幾乎與普通設置相同,只不過初始化應該使用列表完成。

>>> s = OrderedSet([1, 2, 3]) 
>>> s.add(4) 

使用此配方需要您自擔風險。

接下來,in測試集內的正確性。

觀察:

>>> s = set(['hello']) 
>>> 'he' in s 
False 
>>> s.add('he') 
>>> 'he' in s 
True 

換句話說,搜索項必須存在恰好(Python將散列字符串,以確定是否它的存在與否,所以局部串將不匹配)。

OrderedSet也一樣。

+1

這個OrderedSet配方不會擴展內置的'set',它看起來像很多不必要的代碼和一個額外的許可證,可能違反很少的收益。 (是的,有可能違反MIT許可證。) – user2357112

+0

@ user2357112可以確認。我假設'MutableSet'擴展了'set',但是這告訴我否則:'>>> issubclass(MutableSet,set)'... 'False'。感謝您指出了這一點。 –

+0

此外,我的意思是作爲一個建議,以消除額外的「獨特」名單。 –

0
university_col = ... 
universities = set() 
for row in csv_reader: 
    universities.add(row[university_col]) 

result = set() 
base_name = '' 
for university_name in sorted(universities): 
    if not base_name or base_name not in university_name: 
     base_name = university_name 
    result.add(base_name)