とposition
のタプルで構成されるrods
というリストがあります。 position
は、指定されたlength
に対して常に一意です。私は、最も頻繁なロッドの長さを見つけて、隣接するすべてのロッド(最も頻繁に含まれるもの)のユニークな(position
による)ものの合計数を見つけたいと思います。壊れた:一意性の基準を満たす同様のアイテムの総数
- 最初に私は最も頻繁なロッド
length
を見つけたいと思います。 - 次に、隣接するのロッドをいくつかの基準(この例では+ -1)で含めることはできますが、一意の位置がある場合のみ - まだ説明されていない場合(「最も頻度の高い」ロッド元のグループ、または隣接する基準を満たすことによってこのグループに追加された「新しいロッド」によって)。
- そして、この新しい合計頻度を見つけてください。
私はセットをソートして使用することにより、次のようにこれを達成することが可能ですが、おそらくよりよい解決策がある:
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
の両方のロッドは、length=15
(位置21
および5
の位置)の棒で占められている点に位置しています。また、position=21
に重複があり、lengths 13 and 12
です。
ありがとうございます、私は2.6でとても不幸にも私はカウンターを使うことができません。しかし、これはいい見えます。 – fraxel