2015-04-29 155 views
2

我正在嘗試使用不同字符串的元素生成一個隨機字符串,長度相同。從python中的不同字符串生成'random'字符串?

例)字符串:AGAACGC

我使用上述

從字符串僅元素要一個隨機字符串現在我有:

import random 
seq = 'AGAACGC' 
length = len(seq)  

for blah in range(len(seq)): #Apologies for the lame variable names 
    x = random.randint(0,length - 1) 
    print seq[x] 

當然,這會給我什麼樣:

A

A

一個

Ç

一個

一個

我將如何改變程序,以便它打印出我的隨機字符串在同一行?

我希望得到一個相對簡單的答案,因爲我仍然是Python的初學者,所以我不想太花哨。但任何幫助都將不勝感激。

有沒有辦法重複隨機化「n」次?

說不是1個隨機字符串,我想在不同的行上有4個隨機字符串。有沒有簡單的方法做到這一點? (我的新手心態告訴我重複循環'n'次......但它需要是隨機字符串的可變數量)

對不起。我真的很感謝一些幫助。我被困在一個更大的問題上,因爲我不知道如何執行這些步驟。

+0

你想它與空間的一個線之間,或沒有? – abarnert

+0

請不要有空格!謝謝 –

+1

作爲一個方面說明,當Python迫使你給一個你不關心的東西命名時,不用命名它'blah',通常的約定就是將它命名爲'_'。 (除非你使用'gettext'或類似的i18n,它給'_'一個特殊的含義,在這種情況下你的項目可能有自己的約定 - 也許是'__'或'dummy'-你應該遵循。) – abarnert

回答

2

在Python 3中,有一種簡單的方法可以在沒有換行符的情況下打印字符,但在Python 2中沒有。 *所以,要做到這一點最簡單的方法是建立字符串,然後在最後打印:

result = '' 
for blah in range(len(seq)): #Apologies for the lame variable names 
    x = random.randint(0,length - 1) 
    result += seq[x] 
print result 

*有兩種簡單的方法:你可以使用from __future__ import print_function,然後使用Python 3 print語法而不是Python 2,或者您可以對每個字符使用sys.stdout.write(seq[x]),然後在末尾使用sys.stdout.write('\n')sys.stdout.flush()。但我不認爲你想要這些。


不過,也有一些方法來改善這一點:

  • 使用randrange(length),而不是randint(0, length - 1)
  • 使用random.choice(seq)代替首先使用randrangerandint
  • 使用_而不是blah作爲「無關」變量。 *
  • 如果你不關心你正在迭代什麼,只是你爲每個字符迭代一次,只是做for _ in seq:,而不是for _ in range(len(seq)):
  • 建立一個列表的字母,然後在最後調用''.join(),而不是建立一個字符串。
  • 使用理解而不是顯式循環。

把所有在一起:

print ''.join(random.choice(seq) for _ in seq) 

*除非你使用gettext的國際化,還是其他什麼東西,讓_特殊的意義。大多數那些提出自己的「不關心」名稱的項目可能是__dummy。當然,只要你持續使用它,blah就可以適用於這樣的項目。


至於重複它,你的頭腦newbish是正確的;只需使用一個循環。例如(在服用第二個版本,但它會很好的工作與第一):

n = 4 
for _ in range(n): 
    print ''.join(random.choice(seq) for _ in range(len(seq))) 

這會打印出4個不同的隨機字符串。如果您將n設置爲100,則會打印100個不同的隨機字符串。

你可能想在函數中這樣寫:

def print_random_strings(seq, n): 
    for _ in range(n): 
     print ''.join(random.choice(seq) for _ in range(len(seq))) 

然後你可以這樣調用它:

print_random_strings(seq, 4) 

但無論哪種方式,你的基本的直覺是正確的軌道上。

+0

非常感謝! –

+0

我不明白'__future__'的'print_function'的反感。似乎我們應該*鼓勵*初學者使用新功能。 +1,否則。 – jpmc26

+0

@ jpmc26:嗯,我寧願人們剛剛學習Python 3。但是,如果有人在學習2.7,那大概是因爲他們正在使用一本書,在線教程,課堂或任何與Python 2相關的東西,這意味着使用Python 3的功能只會在學習的早期階段將它們混淆,因爲他們的書籍/網站/老師給他們的'print'聲明都不會起作用,他們也不知道爲什麼...... – abarnert

1

這正是random.sample是爲:

import random 
seq = 'AGAACGC' 

"".join(random.sample(seq, len(seq))) 
# Gives you something like: 'CGAAACG'