2012-05-01 7 views
2

は、だから私は、文字列のリストがあります:文字列の最初のカップルの文字を比較

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

を、私はそれぞれがリストに含まれている回数を知りたいです。最初の3文字が同じであれば、文字列全体が同じであることがわかっているので、最初の2文字を比較したいだけです。私は、組み込みのlist.count(x)メソッドを変更できると思っていたか、__eq__演算子をオーバーライドすることができましたが、どちらかを実行する方法がわかりません。

+4

"最初の2文字を比較したいのは、最初の3文字が同じで、文字列全体が同じであることがわかっているからです。将来に壊れるかもしれない仮説のように聞こえる。なぜ単にリスクを避け、文字列全体をチェックするだけではないのですか?あなたは余分な合併症とリスクから何を得ますか? –

+0

組み込みのコレクションで使用できるときにチェックを行うことを全面的に行う理由もあります。カウンターモジュール – cobie

+0

現実には、10万文字を超える文字列をチェックしています長さは約80文字で、すべてではなく最初の25文字を確認する方が早いかもしれません。これが本当かどうかわかりませんが、私はそれを試してみようとしています。 – ohblahitsme

答えて

8

文字の最初のカップルを抽出し、その上で組み込みcollections.Counterクラスを使用する発電機を使用しますマルチンさん@などの溶液として

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

なぜ周波数を見つけるために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} 

このソリューションは、あなたの結果にもう少し柔軟に行うことができます。たとえば、戻り線を変更してgroupedまたはlist(grouped)を返すと、簡単に一致するオブジェクトを取得できます。

+0

ジェネレータ式の最初の要素として、任意のキー関数を使用することができないのはなぜですか? – Marcin

+0

もう少し編集した方がいいでしょう。私はあなたが一連の値(IMOはより複雑なマッピング関数を持っていれば良い)の上に関数をマッピングしているときに、より多くの機能的なツール( 'map'など)を使用することに少し不必要な重点を置こうとしていました。 – Darthfett

+0

ジェネレータ式はマッピ​​ングの単なる構文です。あなたがホットスポットを最適化する必要がない限り、それはコースのためのより多くの馬です。 – Marcin