SORU
13 ŞUBAT 2010, CUMARTESİ


Rasgele dize büyük harf ve Python basamaklı nesil

Boyutta bir dize N. oluşturmak istiyorum

Sayılar ve büyük harf İngilizce olarak yapılmalıdır

  • 6U1S75
  • 4Z4UKK
  • U911K4

Nasıl pythonic bir şekilde bunu başarabilir miyim?

CEVAP
13 ŞUBAT 2010, CUMARTESİ


Tek satırda cevap:

''.join(random.choice(string.ascii_uppercase   string.digits) for _ in range(N))

Daha güvenli bir sürümü; http://stackoverflow.com/a/23728630/2213647 bkz

''.join(random.SystemRandom().choice(string.ascii_uppercase   string.digits) for _ in range(N))

Ayrıca yeniden kullanım için temiz bir fonksiyonu ile detayları:

>>> import string
>>> import random
>>> def id_generator(size=6, chars=string.ascii_uppercase   string.digits):
...    return ''.join(random.choice(chars) for _ in range(size))
...
>>> id_generator()
'G5G74W'
>>> id_generator(3, "6793YUIO")
'Y3U'

Nasıl çalışır ?

string ortak ASCII karakter dizileri içeren bir modül ve random rastgele nesil ile ilgili bir modül ithal ediyoruz.

string.ascii_uppercase string.digits sadece karakterler büyük harf ASCII karakter ve rakam temsil listesini birleştirir:

>>> string.ascii_uppercase
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.digits
'0123456789'
>>> string.ascii_uppercase   string.digits
'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'

O zaman bir liste oluşturmak için liste bir anlama kullanıyoruz 'n' elemanları

>>> range(4) # range create a list of 'n' numbers
[0, 1, 2, 3]
>>> ['elem' for _ in range(4)] # we use range to create 4 times 'elem'
['elem', 'elem', 'elem', 'elem']

Yukarıdaki örnekte, biz kullanmak [ oluşturmak için liste, ama yok içinde id_generator çalışabilmesi için Python yok oluştur listesinde, bellek, ama oluşturan unsurlar anında, tek tek (bu konuda daha fazla here).

Oluşturmak için sormak yerine '' kez dize elem Python oluşturmak için isteyeceğiz 'n' kere rastgele bir karakter, karakter dizisi çekildi: . n

>>> random.choice("abcde")
'a'
>>> random.choice("abcde")
'd'
>>> random.choice("abcde")
'b'

Bu nedenle random.choice(chars) for _ in range(size) gerçekten size karakter dizisi oluşturma. Rastgele chars seçilmiş karakterler:

>>> [random.choice('abcde') for _ in range(3)]
['a', 'b', 'b']
>>> [random.choice('abcde') for _ in range(3)]
['e', 'b', 'e']
>>> [random.choice('abcde') for _ in range(3)]
['d', 'a', 'c']

Biz de daha sonra sıra bir dize olur, boş bir dize ile katılmak:

>>> ''.join(['a', 'b', 'b'])
'abb'
>>> [random.choice('abcde') for _ in range(3)]
['d', 'c', 'b']
>>> ''.join(random.choice('abcde') for _ in range(3))
'dac'

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Developers

    Android Deve

    9 Kasım 2007
  • SelmerSaxMan

    SelmerSaxMan

    24 HAZİRAN 2006
  • Tome Rodrigo

    Tome Rodrigo

    9 Temmuz 2006