Büyük harf ve rakamlarla rastgele dize oluşturma
N boyutunda bir dize oluşturmak istiyorum.
Rakamlardan ve aşağıdaki gibi büyük İngilizce harflerden oluşmalıdır:
- 6U1S75
- 4Z4UKK
- U911K4
Bunu pythonic bir şekilde nasıl başarabilirim?
1239
3
Tek satırda cevap verin:
veya Python 3.6 ile başlayarak
random.choices()
kullanarak daha da kısaltabilirsiniz:Kriptografik olarak daha güvenli bir sürüm; bkz. https://stackoverflow.com/a/23728630/2213647:
Daha fazla yeniden kullanım için temiz bir işlevle ayrıntılı olarak:
**Nasıl çalışıyor?
Yaygın ASCII karakter dizilerini içeren bir modül olan
string
ve rastgele üretimle ilgilenen bir modül olanrandom
modüllerini içe aktarıyoruz.string.ascii_uppercase + string.digits` sadece büyük harf ASCII karakterlerini ve rakamları temsil eden karakter listesini birleştirir:
Daha sonra 'n' elemanlı bir liste oluşturmak için bir liste kavrama kullanırız:
Yukarıdaki örnekte, listeyi oluşturmak için
[
kullanıyoruz, ancakid_generator
işlevinde kullanmıyoruz, böylece Python listeyi bellekte oluşturmuyor, ancak öğeleri tek tek anında oluşturuyor (bu konuda daha fazla bilgi burada).Python'dan `elem' karakter dizisini 'n' kez oluşturmasını istemek yerine, bir karakter dizisinden seçilen rastgele bir karakteri 'n' kez oluşturmasını isteyeceğiz:
Bu nedenle
random.choice(chars) for _ in range(size)
gerçektensize
karakterlerinden oluşan bir dizi oluşturmaktadır. Karakterlerchars
içinden rastgele seçilir:Daha sonra bunları boş bir dize ile birleştiririz, böylece dizi bir dize haline gelir:
Daha basit, daha hızlı ancak biraz daha az rastgele bir yol, her harfi ayrı ayrı seçmek yerine
random.sample
kullanmaktır. n-tekrara izin veriliyorsa, rastgele temelinizi n kat büyütün, örn.Not: random.sample karakterin tekrar kullanılmasını önler, karakter kümesinin boyutunu çarpmak birden fazla tekrarı mümkün kılar, ancak yine de saf rastgele bir seçimde olduğundan daha az olasıdırlar. Eğer 6 uzunluğunda bir karakter dizisi seçersek ve ilk karakter olarak 'X' karakterini seçersek, seçim örneğinde, ikinci karakter olarak 'X' karakterini alma olasılığı ilk karakter olarak 'X' karakterini alma olasılığı ile aynıdır. random.sample uygulamasında, sonraki herhangi bir karakter olarak 'X' elde etme olasılığı, ilk karakter olarak elde etme olasılığının yalnızca 6/7'sidir
Kimsenin buna cevap vermediğini sanıyordum lol! Ama hey, işte benim kendi girişimim: