所以我有一個字符串列表:比較第一夫婦字符串中的字符
list1 = ["1thing", "2thing", "3thing", "1thing"]
,我想找出每一個有多少次是在列表中。事情是,我只想比較第一對字符,因爲我知道如果第一個字符相同,那麼整個字符串是相同的。我在想,我可以修改內置的list.count(x)方法,或者我可以覆蓋__eq__
運算符,但我不知道如何執行其中的任何一個。
所以我有一個字符串列表:比較第一夫婦字符串中的字符
list1 = ["1thing", "2thing", "3thing", "1thing"]
,我想找出每一個有多少次是在列表中。事情是,我只想比較第一對字符,因爲我知道如果第一個字符相同,那麼整個字符串是相同的。我在想,我可以修改內置的list.count(x)方法,或者我可以覆蓋__eq__
運算符,但我不知道如何執行其中的任何一個。
使用發電機來提取第一對夫婦的字符,並使用上內建collections.Counter
類:
Counter(item[:2] for item in list1)
爲什麼要經歷所有的ha ..。使用collections.Counter
模塊來查找頻率。
>>> import collections
>>> x=['1thing', '2thing', '1thing', '3thing']
>>> y=collections.Counter(x)
>>> y
Counter({'1thing': 2, '2thing': 1, '3thing': 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}
這種解決方案允許你更多靈活性的結果。例如,修改返回行以返回grouped
或list(grouped)
可讓您輕鬆獲取匹配的對象。
「我只想比較第一對字符,因爲我知道如果第一個,如3個字符是相同的,那麼整個字符串是相同的。」聽起來就像將來可能會破裂的那種假設。爲什麼不只是避免風險,只是檢查整個字符串?你從額外的併發症和風險中獲得了什麼? –
爲什麼即使經歷了所有嘗試做檢查的時候都可以在構建的集合中使用.Counter模塊 – cobie
我這樣做是因爲實際上,我正在檢查一個列表中包含超過100,000個字符串的列表大約80個字符,檢查前25個字符可能會更快,而不是全部。我不知道這是否屬實,但我試圖對此進行測試。 – ohblahitsme