【问题标题】:Python failure to find all duplicatesPython未能找到所有重复项
【发布时间】:2012-11-19 17:08:22
【问题描述】:

这与随机抽样有关。我正在使用 random.sample(number,5) 从数字中包含的数字范围内返回随机数列表。我使用 while i

if len(numbers) != len(set(numbers)):

识别具有重复项的集合,然后使用 random.sample(number,5) 尝试进行另一次随机化以将集合替换为重复项。我似乎得到了大约 8% 的重新随机化(使用打印语句来说明重复的数字),但似乎遗漏了大约 5%。我做错了什么?实际代码如下:

while i < 100:
    set1 = random.sample(numbers1,5)
if len(set1) != len(set(set1))
    print('duplicate(s) found, random selection repeated')
set1 = random.sample(numbers1,5)

在另一个例程中,我尝试执行与上述相同的操作,但通过添加相同的集合来搜索两组中的重复项,用 set2 替换 set1。这给出了相同类型的故障。 set2 例程缩进并放置在上述例程的正下方。而 i

【问题讨论】:

  • 5% 似乎被遗漏了是什么意思?
  • 在 100 个返回的“集合”中,5 个包含重复项,而大约 8 个已重新随机化,并且与其他集合一样没有重复项
  • 这是部分返回的示例 [3, 10, 10, 21, 26, 41] [8, 11, 15, 22, 23, 33] [7, 20, 30, 34, 36, 40] [14, 28, 30, 33, 35, 46] [7, 22, 35, 37, 45, 48] [11, 21, 28, 40, 41, 45] 发现重复,随机选择重复 [7, 11, 16, 18, 25, 25]
  • 是不是因为if len(set1) != len(set(set1))没有缩进?

标签: python-3.x random-sample


【解决方案1】:

您的代码中没有任何内容可以阻止第二个示例出现重复。如果您执行第二个 while 循环之类的操作会怎样?

while i<100:
    i+=1
    set1 = random.sample(numbers1,5)
    while len(set1) != len(set(set1)):
        print('duplicate(s) found, random selection repeated')
        set1 = random.sample(numbers1,5)

当然,您仍然缺少执行某些操作的代码部分...除了上述之外,如果没有完整的代码示例,很难判断您可能需要更改什么。

编辑:这是来自 cmets 的代码示例的工作版本:

def choose_random(list1,n):
    import random 
    i = 0 
    set_list=[]
    major_numbers=range(1,50) + list1
    print(major_numbers) 
    while i <n: 
        set1 =random.sample(major_numbers,5) 
        set2 =random.sample(major_numbers,2) 
        while len(set(set1)) != len(set1):
            print("Duplicate found at %i"%i)
            print set1
            print("Changing to:")
            set1 =random.sample(major_numbers,5) 
            print set1
        set_list.append([set1,set2])
        i +=1
    return set_list

【讨论】:

  • “做某事”部分只是打印 100 个 set1。当我尝试使用第二个 while 语句时,“程序进入循环打印”发现重复,随机选择重复“不停。我不得不让应用程序崩溃以停止循环。我对此很陌生,所以我在做愚蠢的事情。我认为问题之一是如果发现重复,我没有正确缩进第二次随机化的命令。这会导致例程“错过”重复项吗?
  • 您确定您的范围/对齐方式正确吗?请粘贴您在问题中运行的确切代码。
  • def choose_random(list1): import random i = 0 set1 = [] prev = None major_numbers=list(range(1,50)) major_numbers= list1 + major_numbers print(minor_numbers) print('\ n') while i
  • 在您的问题上单击编辑并将代码放入其中-此代码不完整。 minor_numbers 是什么?
  • 抱歉,minor_numbers 是要附加到 list2 的第二组数字,并执行与 list1 和 major_numbers 相同的例程,无法将整个内容放入允许的字符中。现在可能太混乱了,任何人都无法阅读!
【解决方案2】:

您提供的代码显然有一些空白,并且无法正常工作,因此我无法确定您的错误到底在哪里,但是在 while 循环结束后运行 set1 = random.sample(numbers1,5) (如果如您的问题中所写)撤消您之前所做的一切,因为它会覆盖您设法将set1 设置为的任何内容。

无论如何,random.sample 应该给你一个无需更换的样品。如果您在random.sample(numbers1, 5) 中有任何重复,则意味着您已经在numbers1 中有重复。如果不应该是这种情况,您应该检查 numbers1 的内容,并可能强制它包含唯一的所有内容,例如使用 set(numbers1) 代替。

如果原因是您希望numbers1 中的某些元素具有更高的概率,您可能希望将其设为

set1 = random.sample(numbers1, 5)
while len(set1) != len(set(set1)):
    set1 = random.sample(numbers1, 5)

这可能是一个无限循环,但如果numbers1 包含至少 5 个不同的元素,它将在某个时候退出循环。如果你不喜欢这个循环永远不会退出的理论可能性,你可能应该使用加权样本而不是random.sample,(在stackoverflow上有一些如何做到这一点的例子)并删除你已经拥有的数字从权重表中选择。

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多