我看不到列表中是否有重复的数字

时间:2019-06-13 15:38:17

标签: python insertion

我正在尝试在列表中生成20个随机数。接下来,我想看看其中是否有重复的数字。

我生成了随机数。接下来,我进行了插入排序,以按递增顺序排列列表。要查看我是否有重复的数字,我遍历了列表,并且如果前一个数字等于下一个数字,则我的列表中有重复的数字。

import random

random_array=[]

def array():
  for i in range(0,20):
    random_element=random.randint(1,35)
    random_array.append(random_element)
  return random_array
print(array())

# function to order the list
def insertion_sort():
  for i in range(1,len(random_array)):
    while i>0 and random_array[i-1]>random_array[i]:
      random_array[i-1],random_array[i]=random_array[i],random_array[i-1]
      i=i-1
  return random_array
print(insertion_sort())

def verification():
  for i in random_array:
    insertion_sort()
    if i-1==i:
      return True
    else:
      return False
print(verification())

我的程序总是返回false,与生成的列表无关。

5 个答案:

答案 0 :(得分:1)

您的代码中出现了

  • 您要对元素进行迭代,然后减去它们并进行比较,而应该对索引进行迭代,并使用它们来比较连续的元素

  • 您正在for循环中调用insertion_sort(),我认为这是错误的

  • 您想在找到的第一个匹配项上中断for循环,最后返回一个布尔值,该值指示匹配项是否发生

所以您的代码看起来像

def verification():
    #Flag to keep track of matches
    flag = False
    #Iterate over list via indexes
    for i in range(len(random_array)):
        #If consecutive elements match, set flag to true and break loop
        if random_array[i-1]==random_array[i]:
            flag = True
            break
    #Return flag value
    return flag

答案 1 :(得分:0)

您在这里有两个选择:如果您不关心顺序,则可以使用set,这是一种只能具有唯一元素的数据类型。如果您需要保持数字的原始顺序,则需要使用OrderedDict中的collections

查看此堆栈答案:https://stackoverflow.com/a/7961393/11323304

答案 2 :(得分:0)

您在def验证()中的循环:在第一次迭代后退出,因为否则:返回False(正在退出)

使用简单标志:

@Entity(tableName = "recents",primaryKeys = {"imageLink","catagoryId"})
public class Recents {


    @ColumnInfo(name="imageLink")
    @NonNull
    private String imageLink;

    @ColumnInfo(name="catagoryId")
    @NonNull
    private String catagoryId;

    @ColumnInfo(name="saveTime")
    private String saveTime;

    @ColumnInfo(name = "key")
    private String key;


    public Recents(@NonNull String imageLink, @NonNull String catagoryId, String saveTime, String key) {
        this.imageLink = imageLink;
        this.catagoryId = catagoryId;
        this.saveTime = saveTime;
        this.key = key;
    }

    @NonNull
    public String getImageLink() {
        return imageLink;
    }

    public void setImageLink(@NonNull String imageLink) {
        this.imageLink = imageLink;
    }

    @NonNull
    public String getCatagoryId() {
        return catagoryId;
    }

    public void setCatagoryId(@NonNull String catagoryId) {
        this.catagoryId = catagoryId;
    }

    public String getSaveTime() {
        return saveTime;
    }

    public void setSaveTime(String saveTime) {
        this.saveTime = saveTime;
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
}

答案 3 :(得分:0)

您的验证功能有误。您正在将元素i的值与元素i-1的值进行比较,这永远都是不正确的。试试这个:

import random

random_array=[]

def array():
  for i in range(0,20):
    random_element=random.randint(1,35)
    random_array.append(random_element)
  return random_array
print(array())

# function to order the list
def insertion_sort():
  for i in range(1,len(random_array)):
    while i>0 and random_array[i-1]>random_array[i]:
      random_array[i-1],random_array[i]=random_array[i],random_array[i-1]
      i=i-1
  return random_array
print(insertion_sort())

def verification():
  #for i in random_array:
  status = False # <----
  for i in range(len(random_array)-1): # <------
    insertion_sort()
    #if i-1==i:
    if random_array[i] == random_array[i+1]: # Iterate over list by indexes
      status = True
      break 
  return status
print(verification())

答案 4 :(得分:0)

您可以使用itertools.Counter使用更短的代码来实现:

import random
from collections import Counter

# Generate a random array
random_array = [random.randint(1, 35) for _ in range(20)]


nums = [
    n  # A number
    for (n, count) in Counter(random_array).items()  # From countered items
    if count > 1  # If the count of this number is more than one
]
print(nums)