rods
とのタプルで構成されるリストがlength
ありposition
ます。
position
は、特定の に対して常に一意ですlength
。position
最も頻度の高いロッドの長さを見つけてから、 (最も頻度の高いロッドを含む) 隣接するすべての一意のロッドの出現回数の合計を見つけたいと考えています。内訳:
- まず、最も頻度の高いロッドを見つけたいと思います
length
。 - 次に、いくつかの基準 (この例では +-1) によって隣接している他のすべてのロッドを含めたいと思いますが、それらが
length
一意の位置を持っている場合のみ - まだ考慮されていません (元のグループの「最も頻繁な」ロッドによって、または、隣接する基準を満たすことによってこのグループに追加された「新しいロッド」によって)。 - そして、この新しい総頻度を見つけます。
セットを並べ替えて使用することにより、次の方法でこれを達成できますが、おそらくより良い解決策があります。
import itertools
#tuples of (length, position)
rods = [(18, 21), (17, 2), (15, 3), (14, 21), (14, 5), (13, 6), (13, 7),
(13, 8), (13, 9), (13, 10), (13, 11), (13, 12), (13, 13), (13, 14),
(13, 15), (13, 16), (13, 17), (13, 18), (13, 19), (13, 20), (13, 21),
(13, 22), (13, 23), (13, 24), (13, 25), (13, 26), (12, 5), (12, 21),
(12, 2)]
lengths = [length for length, position in rods]
#gives tuples of lengths and their frequencies:
length_freq = (sorted([(k,len(list(j))) for k,j in itertools.groupby(sorted(lengths))],
key=lambda x: x[1],reverse=1))
best_length = length_freq[0][0]
#cumulative frequency of rods near best_length, with unique position:
tally = (len(set((best_length,v) for j,v in rods
if best_length - 1 <= j <=best_length + 1)))
print length_freq
#output:
#[(13, 21), (12, 3), (14, 2), (15, 1), (17, 1), (18, 1)]
print tally
#output:
#23
注23
は、このテスト データの正解です。の両方のロッドは、 (位置、および) のlength= 14
ロッドによって占められている点にも配置されています。また、 for にも重複があります。length=15
21
5
position=21
lengths 13 and 12