2015-12-27 2 views
1

Мне нужно создать список, который будет иметь случайную буквенно-цифровую строку фиксированной длины. Это будет что-то вроде: list = ['ag5','5b9','c85'] Я могу составить список со случайными числами, но я не могу работать, чтобы создавать строки, которые будут иметь как числа, так и буквы. Список будет иметь фиксированную длину (скажем, 100 пунктов). Я использую python 3.Создайте список случайных строк фиксированной длины в python

+0

Что размер каждого элемента списка? –

+1

Попробуйте googling «генерировать случайные буквенно-цифровые строки python». – intboolstring

+0

@intboolstring ... не тихо..OP хочет сочетание буквенно-цифровых символов. –

ответ

3

string.digits и string.ascii_lowercase могут предоставить вам набор буквенно-цифровых символов. Тогда вы могли бы использовать random.choice в списке понимание для создания списка:

from random import choice 
from string import digits, ascii_lowercase 

chars = digits + ascii_lowercase 
L = ["".join([choice(chars) for i in range(2)]) for j in range(100)] 
print(L) 
+0

Почему это было приостановлено? –

+0

Я использовал этот код, но я не получаю никакого вывода. Окно вывода остается пустым. – Aman

+0

@Aman: это просто понимание списка, вам нужно назначить его некоторому var (обновленному). –

-1

Я бы рекомендовал hashids с минимальной длиной три и пользовательской соли, если вы хотите:

codes = [hasher.encode(i) for i in range(100)] # assuming hasher = hashids.Hashids('', 3) 
+0

Поскольку это метод хэширования, результирующие хэш-коды не будут очень случайными, если вы продолжите использовать ту же соль. Я настоятельно рекомендую использовать случайно сгенерированную соль. –

0

Так как вы нужно, чтобы каждая строка имела как букву, так и число, нам нужно сделать немного больше работы, чем обычно. Мы можем либо генерировать случайные слова, а только принимать те, которые удовлетворяют нашему ограничению, или мы можем построить набор символов, который удовлетворяет ограничению по построению.

from random import choice, shuffle 
from string import digits, ascii_lowercase 

def gen_word(N, min_N_digits, min_N_lower): 
    choose_from = [digits]*min_N_dig + [ascii_lowercase]*min_N_low 
    choose_from.extend([digits + ascii_lowercase] * (N-min_N_low-min_N_dig)) 
    chars = [choice(bet) for bet in choose_from] 
    shuffle(chars) 
    return ''.join(chars) 

def gen_word_rejection(N, min_N_digits, min_N_lower): 
    bet = digits + ascii_lowercase 
    while True: 
     word = ''.join([choice(bet) for i in range(N)]) 
     if (sum(c.isdigit() for c in word) >= min_N_digits and 
      sum(c.islower() for c in word) >= min_N_lower): 
      return word 

, который дает мне

>>> [gen_word(3, 1, 1) for i in range(5)] 
['mb6', 'g4b', 'y5g', '28p', 'ki2'] 
>>> [gen_word_rejection(3, 1, 1) for i in range(5)] 
['y37', 'dr0', 'w1z', 'h2a', 'i6r'] 

все из которых имеют по крайней мере одну цифру и, по меньшей мере, одну букву в нижнем регистре.

-1

Я думаю, вы хотите что-то вроде ниже:

>>> import string 
>>> import random 
>>> L1 = [] 
>>> my_chars = string.ascii_lowercase + string.digits #list of alphanumeric characters 
>>> while(len(L1)<100): #To keep iterating until len(L1)=100 
    s = random.sample(my_chars,3) #Pick a sample(list) of three characters len from chars list 
    if not all(t in string.digits for t in s) and not all(t in string.ascii_lowercase for t in s): #Check if these characters are neither only digits nor letters, only mix of both will be allowed 
     L1.append(''.join(s)) #concatenate the characters to form the string and add it to list L1 


>>> len(L1) 
100 
>>> L1 
['f3m', 'gw2', '9ua', 'm4r', 'fv5', 'jw1', 'd1b', 'lh1', 'i61', '53m', 'j6y', 'fg6', '90d', 'xz1', 'n9f', 'k6r', '31b', 'm8w', '8w1', 'h5q', 'h3d', 'ju2', 'q1i', '6ci', '07m', '40c', 's0h', 'q1p', 'u2o', 'r4g', '6gq', 'rj4', '08x', 'yr6', 'il7', '21w', 'v3q', 'kv9', 'e4i', 'g3o', 'r2p', 'nl7', 'k8h', 'by9', 'qd1', 't71', 'x8f', 'uq3', 'k2z', '5i7', '7pc', 'd68', '6n0', '81y', 'c34', 'la0', 'a0c', '1d9', '7oi', 'z7x', '8l9', '0te', 'e9b', '2yp', '17h', 'vm1', 'vm1', 'ow9', '1ma', 'y7q', '7wa', 'a6b', '9uo', '5t2', 'i40', 'ja1', '16v', '0fe', '6bc', 'ek3', 'th6', '26g', 'a9n', 'fo5', '3hg', '4wz', 'v6z', 'r7b', '9cr', 'a0s', '8yp', 'v0f', 'es4', '8do', 'd0e', 'o6z', 'x3q', 'qw3', 'gi0', '0eg'] 
+0

Да, это работает больше, как я хотел. Теперь я добавил ascii_uppercase. Благодарю. – Aman

+0

только что нашел проблему с этим кодом. Предполагается, что в списке будет 100 буквенно-цифровых строк. Но каждый раз, когда я запускаю его, длина списка меняется случайным образом, в основном в пределах от 50 до 70. Я имею в виду, иногда список содержит 53 элемента, иногда 68 или около того. Предполагается, что i в диапазоне (100) генерирует 100 строк, но я не могу понять, почему этого не происходит. Не могли бы вы помочь? – Aman

+0

@Aman ... Да, я обновил ответ. Фактически, это должно быть 'while' loop ... –

Смежные вопросы