在Python中按项目的所有数字排序

2024-09-24 00:25:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我想按每个项目的数字对列表进行排序

示例:

myCmpItem = '511'
myList = ['111','222','333','444','555','123']

(some magic)

mySortedList = ['111', '222', '333', '123', '444', '555']

算法的工作原理:

  • 将myList中当前项的每个位数与myCmpItem进行比较
    • 对于列表中的第一项,应该是:
    • 5和1的差是4
    • 1和1之间的差为0
    • 1和1之间的差为0
    • 这两个数字的差是4(数字比较的总和)
  • 对所有其他项目执行相同的操作
  • 根据计算出的相似度排序

我可以用很多for循环来编写这个代码,但实际上我正在寻找一种更快的方法来实现这一点。有没有什么算法可以做到这一点呢?快吗?在

进一步限制

  • 在我的示例中,所有项目的长度为3,在实际场景中,它们的长度为25
  • 所有项目的长度相同,len(myList[x])==25始终为真
  • 项目可以是字符串、int、float或更适合算法的任何东西
  • 只有1到5之间的数字

背景

所有项目的数字都是问题的答案,我想找到与给定答案集最相似的答案集。所以“123”意味着用户回答问题1=答案1,问题2=答案2,问题3=答案3。它们是选择题,总共有25个问题(=长度为25),并且总有5个不同的可能回答(即数字1-5)。在

PS:这是我在Stackoverflow上问的第一个问题,所以请对我好一点。我已经在google上搜索了好几个小时,但是我没有找到任何解决方案,所以我问了这里。我希望没问题。而且英语不是我的母语。

答案(感谢所有参与者!)在

@larsmans的回答(https://stackoverflow.com/a/10790714/511484)很好地解释了如何以合理的速度解决这个问题。你甚至可以通过提前计算每个数字之间的距离来加快算法的速度,请看@gnibbler的帖子(https://stackoverflow.com/a/10791838/511484)所有其他的答案都很好而且正确,但是我发现@larsmans有最好的解释。再次感谢大家的帮助!在


Tags: 项目答案httpscom算法示例列表排序
3条回答

使用lambda和列表理解:

sorted(myList, key=lambda item: sum([abs(int(x) - int(y)) for x, y in zip(item, myCmpItem)])
def cmpWith(num):
    def compare(item):
        """ calculate the difference between num and item """
        return sum(
            abs(int(n) - int(x)) # cast to int to make the substraction possible
            for x,n in zip(item, num) # zip makes pairs from both lists 
        )

    return compare

lst = ['111','222','333','444','555','123']
print sorted(lst, key=cmpWith('511'))

首先,从myCmpItem生成一个整数列表,使减法成为可能。在

myCmpItem = map(int, myCmpItem)

然后,定义一个计算项与myCmpItem之间距离的函数。我们还需要将项目映射到整数列表。剩下的只是L1 distance(你正在计算的“差异”的数学名称)的普通公式。在

^{pr2}$

然后,使用这个函数作为key函数进行排序。在

^{3}$

(注:您确定L1距离对这个应用程序有意义吗?使用它表示假设答案1与答案2比答案3更相似,等等。如果不是这样,Hamming distance可能更合适。)

相关问题 更多 >