代码之家  ›  专栏  ›  技术社区  ›  Levent Ozbek

减少列表遍历器的执行时间

  •  0
  • Levent Ozbek  · 技术社区  · 4 年前

    我正在进行编码练习。我的逻辑是有道理的,但在一个大列表中,执行限制被超过了。以下是问题描述:

    给每个候选人一系列的票数 到目前为止,一个整数k等于尚未投票的选民人数 投票了吗,找出还有多少候选人 赢得选举的机会。

    选举的获胜者必须获得比任何人都多的选票 其他候选人。如果两名或两名以上候选人收到相同的(最多) 票数,假设根本没有赢家。

    实例

    对于票数=[2,3,5,2]和k=3,输出应该是 选举获胜者(票数,k)=2。

    第一位候选人获得了两票。即使剩下的3个 候选人投票给他,他仍然只有5票,即 与第三位候选人的人数相同,因此不会有赢家。这个 如果剩下的候选人都投他的票,第二位候选人就可以获胜 (3+3=6>5)。第三位候选人即使没有一位候选人也能获胜 剩下的候选人投他的票。例如,如果 剩下的选民投票给他的每个对手,他将 仍然是赢家(因此投票数组将是[3,4,5,3])。这个 最后一位候选人无论如何都无法获胜(原因与第一位候选人相同) 第一位候选人)。因此,只有两名候选人能获胜(第二名和第二名) 第三),这就是答案。

    这就是我的逻辑。我知道,对于这个问题,我必须检查列表中的每个元素,看看添加k是否会使其成为列表中的最大值。但我也觉得我必须检查列表中出现该值的次数,以正确确定是否有赢家或平局:

    def electionsWinners(votes, k):
        
        # This variable basically counts the number of possible winners in the list
        counter = 0
        
        for i in votes:
            
            # If all votes go into candidate i and its not a tie:
            if k + i > max(votes) and votes.count(k + i) <= 1:
                # Increment one because we have a potential winner
                counter += 1
            
            # If there are no remaining votes and the biggest value of the list only occures once
            elif k == 0 and votes.count(max(votes)) == 1:
                
                # We only have one winner
                counter = 1
        
        return counter
            
    

    我知道我使用 list.max() list.count() 增加执行时间。有哪些方法可以让代码运行得更快?

    虽然我感谢所有的帮助,但看到人们只给出一个简单的答案,我感到非常沮丧。这不是家庭作业。这是为了练习,所以你给我答案根本帮不了我。请告诉我如何修复现有代码。提前谢谢大家。

    0 回复  |  直到 4 年前
        1
  •  2
  •   trincot    4 年前

    一些可以优化的事情:

    • max(votes) 不取决于 i ,因此不应在每次循环迭代中对其进行评估。在循环开始前对其进行一次评估。

    • 表达方式也是如此 k == 0 and votes.count(max(votes)) == 1 。它不依赖于循环变量,因此不应出现在循环中。它应该成为决定循环是否应该执行的条件。

    • k + i > max(votes) and votes.count(k + i) <= 1 :如果条件的第一部分为真,则条件的第二部分始终为真。什么时候 k + i 大于列表中最大的一个,这个总数 出现在列表中,即计数为零。

    综合所有这些,你可以这样写:

    def electionsWinners(votes, k):
        greatest = max(votes)
        if k == 0:
            if votes.count(greatest) == 1:
                return 1
            else:
                return 0
    
        counter = 0
        for i in votes:
            if k + i > greatest:
                counter += 1
        
        return counter
    

    你可以通过使用 sum 而不是“手册” counter += 1 .同时,代码也可以减少一点:

    def electionsWinners(votes, k):
        greatest = max(votes)
        if k == 0:
            return int(votes.count(greatest) == 1)
    
        return sum(1 for i in votes if k + i > greatest)
    

    甚至:

    def electionsWinners(votes, k):
        mx = max(votes)
        return sum(1 for i in votes if k + i > mx) if k else int(votes.count(mx) == 1)