2016-05-13 47 views
0

我在分配一個變量給特定的元素字符串時遇到了一些麻煩。下面是我的代碼的簡化版本:如何將變量分配給列表中的元素的字符串而不是單獨的元素?

import random 
import string 

def printsl(string): 
    import sys 
    sys.stdout.write(string) 
    sys.stdout.flush() 



l = random.sample(string.ascii_lowercase, 26) 
w = random.sample(l, random.randint(4, 10)) 

for elem in w: 
    x = elem  #<------- 
    printsl(x) 

print('') 
printsl(x) 

當我運行這段代碼的輸出是沿

npabjcevz 
z 

znoyhe 
e 

東西線第一行輸出是我想要的,但是由於某種原因,第二行只輸出了最後一個字母字符串。糾正我,如果我錯了,但我猜這是因爲,而不是elem相當於整個隨機元素的字符串,它被重新分配到4-10不同的元素,並打印所有printsl(x)for elem in w但它第二次只是使用最近的一封信。

我怎樣才能讓它打印完整的字符串?或者更具體地說,我如何讓x等於整個輸出字符串?

我唯一能想到的嘗試是將x = elem更改爲x = str(elem),但它給出了相同的結果。

+0

你會看到通過使用'打印你做了什麼更好的(再版( W))'。 –

+0

@MartijnPieters當我使用print(repr(w))時,它顯示了我不想要的所有逗號和括號(列表形式)? – zeurosis

+0

我沒有說這會產生你想要的,我說你會更好地看到你做了什麼。 :-)這表明'w'是單個字符的*列表*。 –

回答

2

是的,你是製造在此字符的單獨列表,因爲random.sample()總是返回一個列表:

l = random.sample(string.ascii_lowercase, 26) 
w = random.sample(l, random.randint(4, 10)) 

第一行挑選一個列表從序列string.ascii_lowercase 26個獨特的隨機字符 。輸入的長度也是26個字符意味着你基本上已經產生了26個字母的隨機洗牌列表。第二行然後從該混洗列表中選擇4到10個字符,再次洗牌。

通過使用自定義的printls函數,在打印的所有內容之後不會添加換行符,因此每個字符for elem in w:循環打印都顯示在前一個字符之後。當循環完成時,for循環變量elem最終被綁定到w列表中的最後一個字符。

您可以通過使用random.sample()一旦得到相同的結果,直接在string.ascii_lowercase

w = random.sample(string.ascii_lowercase, random.randint(4, 10)) 

這仍然是一個列表,但你可以加入結果返回到一個單一字符串str.join()

result = ''.join(w) 

現在,通常是當人們從string.ascii_lowercase中挑選隨機字符時,不介意字符是否重複。例如,你會得到一個更好的密碼。使用random.choice() function一次挑選一個隨機字符,然後在循環中重複此過程以選擇所需的字母數。一個list comprehension可以簡化這一過程,把所有的結果到列表中,你將不得不重新加入結果:

result = ''.join([random.choice(string.ascii_lowercase) 
        for _ in range(random.randint(4, 10))]) 
+0

我不知道我是否正確解釋了這個,但是我把它改成了elem in w: x =''.join(random.sample(string.ascii_lowercase,random.randint(4,10))) printsl(X) 打印( '') printsl(x)和輸出是qmenskxwyuqcukaydwjdfzabpdniomyvklutgwmenzyuqtxwatrikq watrikq ?? – zeurosis

+0

也是我保留L和w分開的原因是因爲在我的實際代碼中(這個只是因爲所有繁忙的垃圾而被簡化了)我想保留L作爲相同的字母順序,但是我有10個不同的W(if這是有道理的) – zeurosis

+0

你不再需要你的'在w'循環elem。所有你需要的是'w = random.sample()'行和'result =''.join(w)'行。你可以使用'x'而不是'result',但'x'不是一個非常具有描述性的變量名稱。 –

相關問題