0

私は2つのリストを持っています:

l1 = ['k', 'l', 'k', 's', 'l', 't', 'k']
l2 = ['h', 't', 'h', 't', 't', 's', 's']

最初のリストの i 番目の位置にある項目と、2 番目のリストの同じ位置にある項目の組み合わせの出現をカウントしたいと考えています。結果を次のようにしたいと思います。

kh = 2、lt = 2、st = 1、ts = 1、ks = 1

最初にリストからタプルを作成するのが最善だと思いました:

tupleList = zip(l1,l2)
tupeleList = [('k', 'h'), ('l', 't'), ('k', 'h'), ('s', 't'), ('l', 't'), ('t', 's'), ('k', 's')]

次に、そのタプルのリスト内の一意の要素をカウントする辞書を作成します。

myDict = {}
for item in tupleList:
    if item[1] in myDict:
        myDi [ item[1] ] += item[2]
    else
        myDi [ item[1] ] = item[2]

しかし、「タプルインデックスが範囲外です」というエラーが表示されます。何が問題ですか?最初にタプルを作るのは効率的ではないでしょうか?

4

1 に答える 1

7

collections.Counterを使用できます:

In [7]: import collections
In [10]: count = collections.Counter(zip(l1,l2))

In [11]: count
Out[11]: Counter({('l', 't'): 2, ('k', 'h'): 2, ('s', 't'): 1, ('t', 's'): 1, ('k', 's'): 1})

はのcollection.Counterサブクラスですdict。したがって、通常は と同じように使用でき、さらに、 、、などの追加のメソッドdictにアクセスできます。elementsmost_commonsubtract


投稿したコードを (最小限の変更で) 修正したい場合は、次のようになります。

l1 = ['k', 'l', 'k', 's', 'l', 't', 'k']
l2 = ['h', 't', 'h', 't', 't', 's', 's']
tupleList = zip(l1,l2)
myDict = {}
for item in tupleList:
    if item in myDict:
        myDict[ item ] += 1
    else:
        myDict[ item ] = 1
print(myDict)       

ただし、dicts には、コードをさらに単純化するために使用できるgetメソッドがあります。

for item in tupleList:
    myDict[item] = myDict.get(item, 0) + 1

または、@JonClements がコメントで指摘しているように、 collections.defaultdictを使用できます。

myDict = collections.defaultdict(int)
for item in tupleList:
    myDict[item] += 1
于 2013-02-27T11:16:38.243 に答える