1
votes

Existe-t-il un moyen de distribuer des lots à un sous-ensemble de listes en utilisant une pente prédéfinie?

édité:

pour faire plus simple imaginons que j'ai un jeu de cartes qui a 60 cartes Je veux ti = o distribuer cette carte pour 6 joueurs.

Je veux que la carte soit distribuée 1 par 1 ou 2 par 2 ou 3 par 3 ou 10 par 10

Code

Uploading the file tolist
total  60 PlayerHods  10.0
Sarting Buulid the combo lists
The max rounds is  2.0
['1', '2', '3', '4', '5', '30', '31', '32', '33', '34', '35', '60']
['6', '7', '8', '9', '10', '36', '37', '38', '39', '40']
['11', '12', '13', '14', '15', '41', '42', '43', '44', '45']
['16', '17', '18', '19', '20', '46', '47', '48', '49', '50']
['21', '22', '23', '24', '25', '51', '52', '53', '54', '55']
['26', '27', '28', '29', '30', '56', '57', '58', '59', '60']
12 10 10 10 10 10

Comme vous pouvez le voir, j'ai le 'Comb1' avec 12 et I peut voir le 30 faisant partie du comb6 et aussi dans le Comb1 ir devrait être seulement dans Comb1 même avec 60

Voici le résultat de mon code:

Sortie

import random

Indtester =0
Testword = []

while Indtester < 60:
   item = random.randint(0,100)
   Testword.append(str(item))
   Indtester=Indtester+1

words=Testword

#---------------Ini variable befeore the build
limt =5
ind = 1
Comb1=[]
Comb2=[]
Comb3=[]
Comb4=[]
Comb5=[]
Comb6=[]

total =len(words)

PlayerHods = total/6
print("total ",total,"PlayerHods ",PlayerHods)
MaxRound =PlayerHods/limt

Round =1

#---------------Ini variable befeore the build
print("Sarting Buulid the combo lists")
print("The max rounds is ",MaxRound)
for line in words:
   if ind <= limt :
        word = line
        word = word.replace("\n","")
        lastwordcomb1 =word
        lastindc1=ind
        Comb1.append(word)
   if ind > limt and ind <= limt*2:
            word = line
            word = word.replace("\n","")
            lastwordcomb2 =word
            lastindc2=ind
            Comb2.append(word)
   if ind > limt*2 and ind <= limt*3:
            word = line
            word = word.replace("\n","")
            lastwordcomb3 =word
            lastindc3=ind
            Comb3.append(word)
   if ind >  limt*3 and  ind <=  limt*4:
            word = line
            word = word.replace("\n","")
            lastwordcomb4 =word
            lastindc4=ind
            Comb4.append(word)
   if ind >  limt*4 and  ind <=  limt*5:
            word = line
            lastwordcomb5 =word
            lastindc5=ind
            word = word.replace("\n","")
            Comb5.append(word)
    if ind >  limt*5 and ind <= limt*6 :
            word = line
            word = word.replace("\n","")
            lastwordcomb6 =word
            lastindc6=ind
            Comb6.append(word)
    ind =ind+1
    if ind >  limt*6:
            word = line
            word = word.replace("\n","")
            lastwordcomb1 =word
            lastindc1=ind
            Comb1.append(word)
            ind =1
            Round=Round+1



 print(Comb1)
 print(Comb2)
 print(Comb3)
 print(Comb4)
 print(Comb5)
 print(Comb6)
print(len(Comb1),len(Comb2),len(Comb3),len(Comb4),len(Comb5),len(Comb6))


12 commentaires

Je ne sais pas ce que fait tout ce code, mais votre question est-elle essentiellement de savoir comment regrouper les éléments d'une liste en sous-groupes d'une taille donnée?


Comme ceci: stackoverflow.com/questions/312443/... ? Sauf qu'au lieu de tirer d'une liste, ils tirent d'une collection de listes?


Pas exactement, c'est similaire quand vous allez mélanger les cartes donc j'ai 6 joueurs et j'ai un jeu de cartes qui a 600 cartes Je veux distribuer la carte pour le joueur 2 par 2 ou 3 par 3 ou 6 par 6


@Djalil - si nous avons 4 Cartes, [A, B, C, D] et 2 joueurs - vous pouvez distribuer 1 par 1 OU 2 par 2. Dans le premier cas, vous obtiendrez [AC, BD] et dans le second cas [AB, CD] . Suis-je bien compris?


@Mortz oui mais dans mon cas j'ai 6 joueurs donc moi et un total de 6 cartes donc je ne peux distribuer que par 2 ou 5 pour avoir un nombre pair de cartes


@Djalillounis pouvez-vous mieux expliquer ce que vous essayez de faire? Je ne comprends rien à votre problème en regardant le code et il ne s'exécute même pas car dans la première itération, il lance une NameError (lastwordcombo2 n'est pas défini)


@ JosuéCortina J'ai une liste qui a 60 éléments, je veux distribuer les 60 éléments à 6 listes prendre 2 ou 5 à chaque fois. Vous pouvez supprimer toutes les impressions et simplement imprimer les listes, je modifierai la question


@Djalillounis Au hasard ou dans l'ordre dans lequel ils apparaissent dans la liste d'origine? Et combien d'éléments devraient figurer sur chaque sous-liste? dix? ou ce n'est pas grave?


Non pas au hasard ils seront 2 pour list1 puis 2 suivants pour list2 les 2 suivants pour list3 ... etc le len (sous-liste) = le total de la grande liste / nombre de sous-liste


@Djalillounis si la liste est [1,2,3,4,5,6,7,8,9] et qu'il y a 3 joueurs, cette partition est-elle correcte? 1: [1,2,7,8] 2: [3,4, 9] 3: [5,6]


@ JosuéCortina non ils doivent tous avoir le même nombre de cartes len (list1) = len (list2) = len (list3)


Laissez-nous continuer cette discussion dans le chat .


3 Réponses :


0
votes

Quelque chose comme ceci

['0', '1', '2', '3', '4', '30', '31', '32', '33', '34']
['5', '6', '7', '8', '9', '35', '36', '37', '38', '39']
['10', '11', '12', '13', '14', '40', '41', '42', '43', '44']
['15', '16', '17', '18', '19', '45', '46', '47', '48', '49']
['20', '21', '22', '23', '24', '50', '51', '52', '53', '54']
['25', '26', '27', '28', '29', '55', '56', '57', '58', '59']

Résultat:

cards = [str(num) for num in range(60)]

num_players = 6

player_hands = []

for player in range(num_players):
    player_hands.append([])

# 1 by 1 or 2 by 2, etc
amount_at_a_time = 5

for card_idx, card in enumerate(cards):
    # Use % to cycle through players 0-5
    current_player = int(card_idx//amount_at_a_time) % num_players

    player_hands[current_player].append(card)

[print(hand) for hand in player_hands]


2 commentaires

bonjour, pas exactement ce que je veux, parce que le 1er joueur devrait 5 cartes successives 0,1,2,3,4,5 puis les 5 suivantes pour le joueur 2 jusqu'à ce qu'il arrive au joueur 6 et ensuite, le joueur1 aura 5 cartes successives


C'est 2 par 2 parce que vous avez dit "Je veux que la carte soit distribuée 1 par 1 ou 2 par 2 ou 3 par 3 ou 10 par 10". Pour qu'il soit 5 à la fois, remplacez amount_at_a_time par 5.



0
votes

Au cas où cela aiderait quelqu'un à trouver la solution dont j'avais juste besoin pour mettre le suivant dans le dernier bloc if sans rien changer:

pour la ligne en mots:

    if ind <= limt :
        word = line
        word = word.replace("\n","")
        lastwordcomb1 =word
        lastindc1=ind
        Comb1.append(word)



    if ind > limt and ind <= limt*2:
            word = line
            word = word.replace("\n","")
            lastwordcomb2 =word
            lastindc2=ind
            Comb2.append(word)

    if ind > limt*2 and ind <= limt*3:
            word = line
            word = word.replace("\n","")
            lastwordcomb3 =word
            lastindc3=ind
            Comb3.append(word)


    if ind >  limt*3 and  ind <=  limt*4:
            word = line
            word = word.replace("\n","")
            lastwordcomb4 =word
            lastindc4=ind
            Comb4.append(word)

    if ind >  limt*4 and  ind <=  limt*5:
            word = line
            lastwordcomb5 =word
            lastindc5=ind
            word = word.replace("\n","")
            Comb5.append(word)

    if ind >  limt*5 and ind <= limt*6 :
            word = line
            word = word.replace("\n","")
            lastwordcomb6 =word
            lastindc6=ind
            Comb6.append(word)

    ind =ind+1
    if ind >  limt*6:
            next
            ind =1
            Round=Round+1


0 commentaires

0
votes

Enfin, je pense que je pourrais comprendre ce que vous voulez. Voici ma solution:

Code

[[0, 1, 2, 9, 10, 11], [3, 4, 5, 12, 13, 14], [6, 7, 8, 15, 16, 17]]

il est extrêmement court et fait un usage exhaustif des compréhensions .

En supposant que TOTAL = 18 , N = 3 , K = 3 et words = list (range ( TOTAL)) (c'est-à-dire [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] ), voici le résultat:

import random

TOTAL = 18
N = 3
K = 3
ROUNDS_SIZE = N * K

words = [random.randint(0, 100) for _ in range(TOTAL)]

partition = [[words[i] for i in (j + n * K + k for j in range(0, TOTAL, ROUNDS_SIZE) for k in range(K))] for n in range(N)]

print(partition)

Faites-moi savoir si cela a fonctionné pour vous.


1 commentaires

@DjalilIounis ma réponse a-t-elle fonctionné pour vous? Si tel est le cas, veuillez le marquer comme accepté (coche verte), sinon, faites-moi savoir ce qui ne va pas. Thnx à l'avance!