如何从列表中删除该数字的倍数的单个数字

时间:2019-06-17 00:36:33

标签: python-3.7

由于我是编码的初学者,所以我想尝试在列表中查找前三个重复的数字。我的问题是,在我的代码中,当数字重复三个时,代码中断。

通常的删除,弹出和删除操作无效,因为它们删除了列表中的一个元素。

import random

r = random.randint
string = ""

def first_repeat(myList):
    myList = sorted(list(myList))
    print(myList)
    number = 0
    final_numbers = []
    loop = 0
    while loop < 2:
        try:
            if number == 0:
                number += 1
            else:
                if myList[loop] == myList[loop-1]:
                    final_numbers.append(myList[loop])
                else:
                    myList.pop(loop)
                    myList.pop  (loop-1)
                    number = 0
            if loop == 0 :
                loop += 1
            else:
                loop -= 1
            if len(final_numbers) > 3:
                return final_numbers[0], final_numbers[1], final_numbers[2] 
            if len(myList) <=1:
                loop += 2
        except:
            continue
    return final_numbers
for n in range(20):
    string = string+str(r(0,9))

print(first_repeat(string))

预期结果应该是前三个重复的数字。

1 个答案:

答案 0 :(得分:0)

我添加了一些打印语句,以便您可以遍历程序并找出代码逻辑错误的地方。

import random

r = random.randint
string = ""

def first_repeat(myList):
    myList = sorted(list(myList))
    print(myList)
    number = 0
    final_numbers = []
    loop = 0
    while loop < 2:
        print( 'inside while loop: loop = {}'.format( loop ))
        try:
            if number == 0:
                number += 1
            else:
                if myList[loop] == myList[loop-1]:
                    print( 'in -> if myList[loop] == myList[loop-1]' )
                    final_numbers.append(myList[loop])
                    print( 'final_numbers: [{}]'.format( ','.join( final_numbers )))
                else:
                    print( 'in first -> else' )
                    myList.pop(loop)
                    myList.pop  (loop-1)
                    number = 0
                    print( 'myList: [{}]'.format( ','.join( myList ) ))
            if loop == 0 :
                loop += 1
            else:
                loop -= 1
            if len(final_numbers) > 3:
                print( 'returning final numbers' )
                print( final_numbers )
                return final_numbers[0], final_numbers[1], final_numbers[2]
            if len(myList) <=1:
                loop += 2
        except:
            continue
        print( 'at end of this loop final numbers is: [{}]'.format( ','.join( final_numbers)))
        print( 'press any key to continue loop: ')
        input()
    return final_numbers
for n in range(20):
    string = string+str(r(0,9))

print(first_repeat(string))

以下是利用python defaultdict的方法 https://docs.python.org/2/library/collections.html#collections.defaultdict

#import defaultdict to keep track of number counts 
from collections import defaultdict

#changed parameter name since you are passing in a string, not a list
def first_repeat( numbers_string ):

    #create a dictionary - defaulddict( int ) is a dictionary with keys 
    #instantiated to 0 - (instead of throwing a key error)
    number_count = defaultdict( int ) 

    #convert your string to a list of integers - look up list iterations
    numbers = [ int( s ) for s in list( numbers )]

    # to store the repeated numbers
    first_three_repeats = [] 
    for number in numbers:

        # for each number in the list, increment when it is seen
        number_count[number] += 1

        #at first occurence of 3 numbers, return the number
        if number_count[number] == 2:
            first_three_repeats.append( number )
            if len( first_three_repeats ) == 3:
                return first_three_repeats

    #if here - not three occurrences of repeated numbers
    return []


for n in range(20):
    string = string+str(r(0,9))
print( findFirstThreeNumbers( string ))