如果一个列表中的数字与另一个列表中的数字相同,Python将返回一个结果

2024-06-17 10:57:18 发布

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

我正在编写一个乐透模拟器,其中的代码为中奖号码和1000名玩家从45个数字中生成6个随机唯一的数字,这两个数字都存储为列表

我想做的是计算每个部门的获奖人数

因此,如果所有6个中奖号码都等于玩家的6个号码,那么是1区,如果6个中奖号码中的任何5个号码等于玩家的6个号码中的5个号码,那么是2区,如果6个中奖号码中的任何4个号码等于玩家的6个号码中的4个号码,那么是3区,依此类推

目前我的代码只查找第1部分,不计算找到6/6匹配项(如果有的话)的次数。这就是我陷入困境的地方,我如何做到这一点,同时还需要找到匹配的5/6,4/6,3/6

我使用二进制搜索算法来比较中奖号码和玩家拥有的号码

winNum = [37, 10, 36, 26, 19, 43]
lotto = [[5, 19, 21, 24, 30, 38], [10, 11, 15, 24, 32, 34], ...]

# Calculates the total number of winners for each division.    
def totalWinners():
    target = winNum
    search = binarySearch
    i = 0
    for i in range(len(lotto)):
        found = search(target, lotto, 0, len(lotto)-1)
        if found == -1:
            print(lotto[i])
            print("search unsuccessful...")

#Binary search algorithm.
def binarySearch (target, p, left, right):
     l = left
     r = right
     while l <= r:
         f = (l+r)//2
         if target == p[f]:
             return f          
         elif target < p[f]:
             r = f - 1         
         else:
             l = f + 1         
     return -1 

谢谢你的帮助


Tags: 代码targetforsearchlenifdef玩家
1条回答
网友
1楼 · 发布于 2024-06-17 10:57:18

sets来说,这似乎是一份更好的工作。您可以免费获得更简单有效的交叉口计算

winNumSet = set(winNum)
for entry in lotto:
    division = len(set(entry) & winNumSet)

它告诉你条目所在的“部门”。以最适合你的总体目标的方式来处理它

显然,如果您能够控制winNumlotto元素的生成方式,那么首先从集合开始会更有效

相关问题 更多 >