Single lists with at least 2 elements of difference

2

Considering the numbers:

01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25

How do I generate lists of 15 items (numbers quoted above), and they must have at least 2 items of difference between them. For example:

01,02,03,04,05,06,07,08,09,10,11,12,13,14,15
01,02,03,04,05,06,07,08,09,10,11,12,13,17,18
01,02,03,04,05,06,07,08,09,10,11,12,13,20,22
01,02,03,04,05,06,07,08,09,10,11,12,13,21,25

Please note in the end, I have just changed the last 2 items of each list, they are unique, they do not exist in the other lists. How do you do this in practice, and the 2 difference items can be in any position?

    
asked by anonymous 29.05.2018 / 03:02

1 answer

0

Update 1

Another way to get the result is by removing the elements already added to the lists:

import random

def gera_lista(qnt):
  listas = []
  numeros = random.sample(range(1, 100), 25)
  # Sorteia 13 elementos da lista 'numeros'
  primeiros = random.sample(numeros, 13)
  # Pega a diferença entre a lista 'numeros' e a lista 'primeiros'
  # e define como novo valor da lista 'numeros'
  numeros = list(set(numeros).difference(set(primeiros)))
  for _ in range(0, qnt):
    # Se o numero de elementos na lista: 'numeros' for
    # igual a zero para o laço 'for'
    if len(numeros) == 0: break
    # Sorteia os dois ultimos numeros e
    # depois cria uma nova lista com a junção da
    # lista: 'numeros' com a lista: 'sorteados'
    sorteados = random.sample(numeros, 2)
    lista = primeiros + sorteados
    # Adiciona a nova lista na lista: 'listas'
    listas.append(lista)
    # Remove os numeros sorteados da lista: 'numeros'
    [numeros.remove(x) for x in sorteados if x in numeros]
  return listas

print(gera_lista(20))

See working at repl.it and also I created a Gist in GitHubGist

Create a function and use random.sample to draw two numbers and chain.from_iterable to check if these two elements are in the list.

def diferente(lista):
    # Sortea dois números
    a, b = random.sample(numeros, 2)
    # Verifica se 'a' e 'b' não esta na lista
    # se estiver, chama a função novamente, caso contrário
    # adiciona
    [lista.extend([a,b]) if (a not in chain.from_iterable(listas)) and (b not in chain.from_iterable(listas)) else diferente(lista)]

declare an empty list:

nova_lista = []

Draw the first 13 numbers and store them in a variable:

# Sorteia os 13 primeiros elementos
primeiros = random.sample(numeros, 13)

Then within for , add the first elements in the new list, call the function to add the other two and a reset in the list:

# Adiciona os primeiros elementos na nova lista
nova_lista.extend(primeiros)
# Adiciona os outros dois elementos
diferente(nova_lista)
listas.append(nova_lista)
# Reseta a lista
nova_lista = []

See the complete code:

import random
from itertools import chain

numeros = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]
listas = []

def gera_lista(qnt):
    nova_lista = []
    # Sorteia os 13 primeiros elementos
    primeiros = random.sample(numeros, 13)
    for i in range(0, qnt):
        # Adiciona os primeiros elementos na nova lista
        nova_lista.extend(primeiros)
        # Adiciona os outros dois elementos
        diferente(nova_lista)
        listas.append(nova_lista)
        nova_lista = []

def diferente(lista):
    # Sortea dois números
    a, b = random.sample(numeros, 2)
    # Verifica se 'a' e 'b' não esta na lista
    # se estiver, chama a função novamente, caso contrário
    # adiciona
    [lista.extend([a,b]) if (a not in chain.from_iterable(listas)) and (b not in chain.from_iterable(listas)) else diferente(lista)]

gera_lista(5)
print(listas)

See working at repl.it and also I created a Gist in GitHubGist

References

29.05.2018 / 05:27