2017-06-20 113 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)