python-符合唯一性标准的相似项的总数
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python-符合唯一性标准的相似项的总数,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2949字,纯文字阅读大概需要5分钟。
内容图文
我有一个列表,它由长度和位置的元组组成.
对于给定的长度,位置始终是唯一的.我想找到最频繁的杆长度,然后是所有唯一的(按位置)相邻杆(包括最频繁的)出现的总数.细分:
>首先,我想找到最频繁的杆长度.
>然后,我想以某种标准(在此示例中为-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是此测试数据的正确答案.由于两个长度= 14的杆都位于长度= 15的杆所占据的位置(位置21和5).长度13和长度12在位置21处也有重叠.
解决方法:
我认为您的总体压缩是一个合理的解决方案.我的主要建议是将其分解一些.此外,与其在这里使用groupby,不如在可能的情况下使用Counter或在不使用defaultdict的情况下更好. groupby用于对预分类的物料进行惰性操作;如果它不是预先排序的,并且您不需要懒惰,则可能不应该使用它.
由于Nolen Royalty提供了基于defaultdict的解决方案,因此我将在此处使用Counter,但请参见下面的替代品.结果是一个O(n)算法;由于您的排序,所以您的排序为O(n log n),所以这是一个轻微的改进.
import collections
#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)
length_freq = collections.Counter(lengths)
((best_length, _),) = length_freq.most_common(1)
print best_length
#cumulative frequency of rods near best_length, with unique position:
rod_filter = ((l, p) for l, p in rods if best_length - 1 <= l <= best_length + 1)
tally = len(set((best_length, p) for l, p in rod_filter))
print length_freq
print tally
由于您无法使用Counter,因此为了完整起见,这是一种替代方法.这是这两行的直接替代:
length_freq = collections.Counter(lengths)
((best_length, _),) = length_freq.most_common(1)
只需将其替换为:
length_freq = collections.defaultdict(int)
for l in lengths:
length_freq[l] += 1
best_length = max(length_freq, key=length_freq.get)
还请注意,我之前的代码有错误;现在已修复.
内容总结
以上是互联网集市为您收集整理的python-符合唯一性标准的相似项的总数全部内容,希望文章能够帮你解决python-符合唯一性标准的相似项的总数所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。