例:
myCmpItem = '511'
myList = ['111','222','333','444','555','123']
(some magic)
mySortedList = ['111', '222', '333', '123', '444', '555']
Run Code Online (Sandbox Code Playgroud)
我可以使用很多for循环来编写代码,但实际上我正在寻找一种更快的方法来实现这一点.有没有算法做那样的事情?快速?
所有项目的数字都是问题的答案,我想找到与给定答案集最相似的答案集.所以"123"表示用户回答问题1 =答案1,问题2 =答案2,问题3 =答案3.它们是多项选择题,总共25个问题(=长度为25),总有5个不同可能回答(这些是数字1-5).
PS:这是我在Stackoverflow上提出的第一个问题所以请与我好心.我已经谷歌搜索了几个小时,但我找不到任何解决方案,所以我在这里问.我希望这很好.英语也不是我的母语.
@larsmans的回答(/sf/answers/755350011/)解释了如何以合理的速度解决这个问题.您甚至可以通过提前计算每个数字之间的距离来加速算法,请参阅@ gnibbler的帖子(/sf/answers/755428691/)所有其他答案也很好而且正确,但我发现@larsmans有最好的解释.再次感谢大家的帮助!
首先,制作一个整数列表,myCmpItem使减法成为可能.
myCmpItem = map(int, myCmpItem)
Run Code Online (Sandbox Code Playgroud)
然后,定义一个计算项目和之间距离的函数myCmpItem.我们还需要将项目映射到整数列表.其余的只是L1距离的香草公式(你正在计算的"差异"的数学名称).
def dist(item):
item = map(int, item)
return sum(abs(item[i] - myCmpItem[i]) for i in xrange(len(item)))
Run Code Online (Sandbox Code Playgroud)
然后,使用此功能作为key排序功能.
sorted(myList, key=dist)
Run Code Online (Sandbox Code Playgroud)
(PS:你确定L1距离对于这个应用是否有意义?使用它表示假设答案1更接近答案2而不是答案3等等.如果不是这样,汉明距离可能更合适.)
使用lambda和列表理解:
sorted(myList, key=lambda item: sum([abs(int(x) - int(y)) for x, y in zip(item, myCmpItem)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
239 次 |
| 最近记录: |