27

私はPythonにかなり慣れていませんが、どこにも問題の解決策を見つけることができませんでした.

タプルのリスト内の文字列の出現をカウントしたい。

タプルのリストは次のとおりです。

list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
        ]

私はこれを試しましたが、それは単に0を出力します

for entry in list1:
    print list1.count(entry[0])

リストに同じ ID が 2 回出現するため、次のように返されます。

2
1

また、同じ ID が出現するたびにカウンターをインクリメントしようとしましたが、書き方がよくわかりませんでした。

*編集:Eumiroの素晴らしい回答を使用。問題全体を説明していないことに気づきました。実際には、値が 1 より大きいエントリの総数が必要です。

for name, value in list1:

    if value > 1:
        print value

次のエラーが表示されます。

ValueError: Too many values to unpack
4

3 に答える 3

46

多分collections.Counterあなたの問題を解決することができます:

from collections import Counter
Counter(elem[0] for elem in list1)

戻り値

Counter({'12392': 2, '7862': 1})

リストを一度だけ反復するため、高速です。エントリを反復処理してから、リスト内のこれらのエントリの数を取得しようとします。これは では実行できませんが.count、次のように実行できます。

for entry in list1:
    print(sum(1 for elem in list1 if elem[0] == entry[0]))

しかし、真剣に、見てくださいcollections.Counter

編集:実際には、1より大きい値を持つエントリの合計数が必要です.

あなたはまだ使用することができますCounter

c = Counter(elem[0] for elem in list1)
sum(v for k, v in c.iteritems() if v > 1)

を返します2。つまり、1 より大きいカウントの合計です。

于 2013-04-15T11:01:27.060 に答える
6

list1.count(entry[0])の 3 つのタプルのそれぞれを調べるため、機能しませんlist1。たとえば、('12392', 'some string', 'some other string')それらが等しいかどうかをチェックしますが、明らかにそうではありません。'12392'

@eurmiroの答えは、それを行う方法を示しています(これが最良の方法です!)が、辞書とキーを取得しようとする方法( )を使用してCounterどのように機能するかを説明する貧乏人のバージョンがありますが、そうでない場合は'存在しない場合は、代わりにデフォルト値を返します ( ):Counterdict.get(k, [,d])kd

>>> list1 = [
         ('12392', 'some string', 'some other string'),
         ('12392', 'some new string', 'some other string'),
         ('7862', None, 'some other string')
]
>>> d = {}
>>> for x, y, z in list1:
        d[x] = d.get(x, 0) + 1


>>> d
{'12392': 2, '7862': 1}
于 2013-04-15T11:11:06.323 に答える