この形式のデータがあるとしましょう(タブ区切りを想定)
1 10,11,15
2 12
3 12,11
4 10,11
リストを反復処理して、2 番目の列で最も人気のあるオブジェクトのペアをカウントするにはどうすればよいですか? 2 番目の列に無制限の数のアイテムを含めることができるとします。
理想的な出力は次のようなものを返します
pairs count
10,11 (2)
10,15 (1)
11,15 (1)
11,12 (1)
この形式のデータがあるとしましょう(タブ区切りを想定)
1 10,11,15
2 12
3 12,11
4 10,11
リストを反復処理して、2 番目の列で最も人気のあるオブジェクトのペアをカウントするにはどうすればよいですか? 2 番目の列に無制限の数のアイテムを含めることができるとします。
理想的な出力は次のようなものを返します
pairs count
10,11 (2)
10,15 (1)
11,15 (1)
11,12 (1)
これらはどちらも、入力をリストのリストに入れることができると仮定しています。
Python 2.7 を使用している場合は、 とCounter
を組み合わせて試してitertools
ください。
>>> from collections import Counter
>>> from itertools import combinations
>>> l = [[10, 11, 15], [12], [12, 11], [10, 11]]
>>> c = Counter(x for sub in l for x in combinations(sub, 2))
>>> for k, v in c.iteritems():
... print k, v
...
(10, 15) 1
(11, 15) 1
(10, 11) 2
(12, 11) 1
Python < 2.6 を使用している場合は、 adefaultdict
と組み合わせて使用できますitertools
(よりクリーンなソリューションが、教祖の 1 人によって提供されると確信しています)。
In [1]: from collections import defaultdict
In [2]: from itertools import combinations
In [3]: l = [[10, 11, 15], [12], [12, 11], [10, 11]]
In [4]: counts = defaultdict(int)
In [5]: for x in l:
...: for item in combinations(x, 2):
...: counts[item] += 1
...:
...:
In [6]: for k, v in counts.iteritems():
...: print k, v
...:
...:
(10, 15) 1
(11, 15) 1
(10, 11) 2
(12, 11) 1
In [7]: with open("data1.txt") as f:
lis=[map(int,x.split(",")) for x in f]
...:
In [8]: Counter(chain(*[combinations(x,2) for x in lis]))
Out[8]: Counter({(10, 11): 2, (10, 15): 1, (11, 15): 1, (12, 11): 1})
combinations
とを使用できますCounter
。
from itertools import combinations
import collections
newinput = []
# Removes the tabs
for line in oldinput:
newinput.append(line.partition("\t")[2])
# set up the counter
c = collections.Counter()
for line in newinput:
# Split by comma
a = line.split(',')
# make into integers from string
a = map(int, a)
# add to counter
c.update(combinations(a, 2))
次に、Counter
すべてのカウントを含む a になります: `(10,15): 1) など。