2015-04-01 54 views
4

我試圖在python中編寫代碼來生成輸入字符串的所有排列。在Python中打印時名稱錯誤消失

inp = raw_input() 

out = [inp[0]] 
for i in range(1,len(inp)): 
    #print [range(len(j)+1) for j in out] 
    out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out] 

print out 

對於輸入 'ABC' 時,它輸出

Traceback (most recent call last): File "perm.py", line 6, in

out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out] 

NameError: name 'j' is not defined

shell returned 1

如果我取消線5,以及將碼看起來像

inp = raw_input() 

out = [inp[0]] 
for i in range(1,len(inp)): 
    print [range(len(j)+1) for j in out] 
    out = [j[:k]+inp[i]+j[k:] for k in range(len(j)+1) for j in out] 

print out 

對於輸入 'ABC' 時,它輸出

[[0, 1]]

[[0, 1, 2], [0, 1, 2]]

['cba', 'cab', 'bca', 'acb', 'bac','abc']

What sorce這是嗎?

+2

您定義'j'。 – 2015-04-01 08:34:09

+0

@MartijnPieters但是,這不僅僅是爲了印刷過程中使用的列表理解嗎?如果你說我必須明確地定義它們,'k'怎麼辦? – Cheeku 2015-04-01 08:35:21

+0

我的意思是說,在你的列表理解中,你會得到'j'的名字錯誤,因爲當range(len(j)+1)執行時它還沒有被賦值,*除非你包含你的'print'語句,它具有分配給'j'的列表理解。 :-) – 2015-04-01 08:46:21

回答

3

你有你的列表理解循環回到前面;你需要列出他們嵌套順序從左至右,所以你需要for j in out第一

out = [j[:k]+inp[i]+j[k:] for j in out for k in range(len(j)+1)] 

print語句列表修真您的版本遍歷定義的j名稱;在Python 2中,列表理解沒有自己的範圍,因此for循環目標在循環完成後可以訪問,就像使用常規的for循環一樣。在Python 3中,這一點已經發生了變化,其中列表解析現在可以得到它們自己的作用域,就像dict並設置解析和生成器表達式一樣。

如果有幫助,首先將列表解析寫爲常規循環;你的代碼這樣做:

tmp = [] 
for j in out: 
    tmp.append(range(len(j)+1)) 
print tmp 

out = [] 
for k in range(len(j)+1): 
    for j in out: 
     out.append(j[:k]+inp[i]+j[k:]) 

其中range(len(j)+1)表達只有作品,因爲你已經使用j在前面的表達式爲print建設tmp一個for循環目標。

你可能會處理這是一個編碼的運動,但標準庫中已經包括產生排列的功能:itertools.permutations()

from itertools import permutations 

inp = raw_input() 
print list(permutations(inp)) 

演示:

>>> from itertools import permutations 
>>> list(permutations('abc')) 
[('a', 'b', 'c'), ('a', 'c', 'b'), ('b', 'a', 'c'), ('b', 'c', 'a'), ('c', 'a', 'b'), ('c', 'b', 'a')] 
+0

是的,這是爲了向其他人解釋列表理解。 -_- 結束了自己學習的東西。 – Cheeku 2015-04-01 08:51:12