我有一个列表,rods
它由 和 的元组length
组成position
。
position
对于给定的length
. position
我想找到最常见的杆长度,然后是所有唯一(按)相邻杆(包括最频繁)的出现总数。分解:
- 首先我想找到最频繁的杆
length
。 - 然后我想包括所有其他
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
在for也有重叠lengths 13 and 12
。