2012-05-01 83 views
2

所以我有一個字符串列表:比較第一夫婦字符串中的字符

list1 = ["1thing", "2thing", "3thing", "1thing"] 

,我想找出每一個有多少次是在列表中。事情是,我只想比較第一對字符,因爲我知道如果第一個字符相同,那麼整個字符串是相同的。我在想,我可以修改內置的list.count(x)方法,或者我可以覆蓋__eq__運算符,但我不知道如何執行其中的任何一個。

+4

「我只想比較第一對字符,因爲我知道如果第一個,如3個字符是相同的,那麼整個字符串是相同的。」聽起來就像將來可能會破裂的那種假設。爲什麼不只是避免風險,只是檢查整個字符串?你從額外的併發症和風險中獲得了什麼? –

+0

爲什麼即使經歷了所有嘗試做檢查的時候都可以在構建的集合中使用.Counter模塊 – cobie

+0

我這樣做是因爲實際上,我正在檢查一個列表中包含超過100,000個字符串的列表大約80個字符,檢查前25個字符可能會更快,而不是全部。我不知道這是否屬實,但我試圖對此進行測試。 – ohblahitsme

回答

8

使用發電機來提取第一對夫婦的字符,並使用上內建collections.Counter類:

Counter(item[:2] for item in list1) 
5

爲什麼要經歷所有的ha ..。使用collections.Counter模塊來查找頻率。

>>> import collections 
>>> x=['1thing', '2thing', '1thing', '3thing'] 
>>> y=collections.Counter(x) 
>>> y 
Counter({'1thing': 2, '2thing': 1, '3thing': 1}) 
1

可能不是作爲一種解決方案爲@馬爾欽的一樣好,但使用itertools.groupby可能使它更具可讀性和靈活性。

from itertools import groupby 

def group_by_startswith(it, n): 
    """Get a dict mapping the first n characters to the number of matches.""" 

    def first_n(str_): 
     return str_[:n] 

    startswith_sorted = sorted(it, key=first_n) 
    groups = groupby(startswith_sorted, key=first_n) 

    return {key: len(list(grouped)) for key, grouped in groups} 

示例輸出:

>>> list1 = ["1thing", "2thing", "3thing", "1thing"] 
>>> print(group_by_startswith(list1, 3)) 
{'3th': 1, '2th': 1, '1th': 2} 

這種解決方案允許你更多靈活性的結果。例如,修改返回行以返回groupedlist(grouped)可讓您輕鬆獲取匹配的對象。

+0

爲什麼不可能將任意鍵函數用作生成器表達式的第一個元素? – Marcin

+0

我想我應該編輯一點。當你將一個函數映射到一系列值時(IMO更好,當你有一個更復雜的映射函數)時,我試圖把一點不必要的重點放在使用更多功能工具(比如'map')上。 – Darthfett

+0

生成器表達式只是映射的語法。除非你需要優化熱點,否則它對於課程來說就是更多的馬匹。 – Marcin