3

だから私は文字列のリストを持っています:

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

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

4

3 に答える 3

9

ジェネレーターを使用して最初の数文字を抽出し、その上で組み込みcollections.Counterクラスを使用します。

Counter(item[:2] for item in list1)
于 2012-05-01T19:57:58.323 に答える
5

collections.Counterモジュールを使用して周波数を見つけます。

>>> import collections
>>> x=['1thing', '2thing', '1thing', '3thing']
>>> y=collections.Counter(x)
>>> y
Counter({'1thing': 2, '2thing': 1, '3thing': 1})
于 2012-05-01T19:57:05.203 に答える
1

おそらく@Marcinのソリューションほど良くはありませんが、使用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}

このソリューションにより、結果の柔軟性が少し向上します。たとえば、return 行を return groupedorに変更するlist(grouped)と、一致するオブジェクトを簡単に取得できます。

于 2012-05-01T20:53:04.270 に答える