Python: столб забора, вызванный циклом for - PullRequest
0 голосов
/ 23 июня 2018

Я пытаюсь построить базовый генератор случайных серийных чисел в Python, который вставляет каждый сгенерированный S \ N в список.В конце каждого сгенерированного S \ N ставится лишняя черта (-).Например:

XXXX-YYYY-ZZZZ-NNNN-

Код:

import random
import string

x = ""
l = [] # A blank list

for y in range(0,3): # Creating 3 different serial numbers
    for t in range(0,4): # Creating 4 sections to each S\N and seperating them with a dash (-)
        for i in range(0, 5): # Creating a 5 letters combination
            x += random.choice(string.ascii_letters)

        x += "-" # Causes problem since printed 4 times instead of 3   
    l.append(x)
    x = ""
print(l)

Вывод:

['GzWFP-Owoyk-NNKBk-RKZBm-', 'nxTtS-aGVff-yVfLo-WQVJN-', 'HUmTd-XzSSK-weSKs-BHNSv-']

Я пробовал разные варианты, но ни один из них не работает.С наилучшими пожеланиями.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вы можете просто rstrip () оскорбительного '-', прежде чем добавить свой SN в список серийных номеров:

# create SN like above, change l.append(x) to: 
l.append(x.rstrip('-')) # removes the -from the right end before appending

Если вам нужно произвести партии ибыстро, вы должны нарисовать все необходимые символы сразу вместо по одному символу за раз и просто расположить разделители между группами следующим образом:

import random
import string

def createSN(groups = 4, charPerGroup = 5, spacer = '-'):
    """Create a serial number with 'groups' groups consisting 
    of 'charPerGroup' chars with 'spacer' between groups."""

    total = groups * charPerGroup
    # creates all characters with one call to random
    chars = random.choices(string.ascii_letters, k = total)
    # uses list slicing and string joining to divide created characters 
    # in groups and puts the spacer character between groups
    return spacer.join( ''.join(chars[i:i+charPerGroup]) for i in range(0,total,amount))


# create a list of 3 SN:
l = [createSN() for _ in range(3)]  

print(l)

Выходные данные:

['ONHVQ-PvIvo-ZVdRU-HYCZz', 'BWQnt-nRCGG-raoVt-XEWif', 'mMPDd-KakQR-BDkRG-MdqBX']

Это похоже и (но я думаю) превосходит решение @CoryKramer, он по-прежнему рисует каждый символ по отдельности - и использование функции делает его немного более понятным, что происходит.

0 голосов
/ 24 июня 2018

Это немного кратко для однострочного, но это можно сделать, используя str.join в понимании списка.
В основном вы можете использовать random.choice вместо string.ascii_letters для длины каждой подстрокихотите, затем '-'.join объедините подстроки, используя дефисы, затем повторите это для количества элементов, которое вы хотите.

>>> from random import choice
>>> from string import ascii_letters
>>> ['-'.join(''.join(choice(ascii_letters) for j in range(5)) for i in range(4)) for k in range(3)]
['HjPVn-sZFRG-RooXu-PicTA', 'dEZPM-sSXKx-XWWAz-qxyUd', 'BHyHE-fhGWb-sDutN-QIrJV']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...