2011-04-20 92 views
0

當我鍵入以下到解釋我得到所需的輸出行爲:幫助與理解列表功能

>>> x = (7, 2, 1, 1, 6, 2, 1, 2, 1, 2, 2, 6) 
>>> y = list(x) 
>>> y 
[7, 2, 1, 1, 6, 2, 1, 2, 1, 2, 2, 6] 

上面,我只是轉換一個元組的列表。但是,當我運行下面的代碼時,我得到一個我不明白的答案。

pwm = input("enter PWM: ") 
npwm = pwm.replace('),(', ', ') 
y = list(npwm) 
print(y) 

輸出:

['(', '7', ',', ' ', '2', ',', ' ', '1', ',', ' ', '1', ',', ' ', '6', ',', ' ', '2', ',', ' ', '1', ',', ' ', '2', ',', ' ', '1', ',', ' ', '2', ',', ' ', '2', ',', ' ', '6', ')'] 

任何人都可以向我解釋發生了什麼?爲什麼上面的代碼沒有產生所需的輸出:

[7, 2, 1, 1, 6, 2, 1, 2, 1, 2, 2, 6] 

編輯:哇,我不能感謝大家足夠的幫助!我非常感謝大家的患者,並願意幫助我解決初學者的問題。非常感謝你。下面是我開始工作的解決方案:

pwm = (7, 2, 1, 1),(6, 2, 1, 2),(1, 2, 2, 6) 
npwm = pwm.replace('),(',', ').strip('(').strip(')') 
y = list(ast.literal_eval(npwm)) 
print(y) 
+2

您應該包含輸入。在這種情況下,我們可以猜出它,但通常這很重要。 – delnan 2011-04-20 20:43:14

回答

6

當您在一個字符串調用list,它會生成一個列表,其中每個字符是在列表中的項目。因此,例如:

>>> list("hey, you") 
['h', 'e', 'y', ',', ' ', 'y', 'o', 'u'] 

由於數據從input在這種情況下返回是一個字符串,呼籲它list生成字符的列表。

出於演示的緣故,這裏的字符串'(1, 2, 3)'轉換成列表[1, 2, 3]一種基本的方法:

>>> pwm = raw_input("enter PWM: ") 
enter PWM: (1, 2, 3) 
>>> pwm 
'(1, 2, 3)' 
>>> npwm = pwm.strip('(').strip(')') 
>>> npwm 
'1, 2, 3' 
>>> npwm = npwm.split(',') 
>>> npwm 
['1', ' 2', ' 3'] 
>>> y = [int(x) for x in npwm] 
>>> y 
[1, 2, 3] 

有些人已經開始使用由input返回的字符串eval建議。儘管這樣做會達到你想要的效果,但這是一個非常糟糕的習慣,因爲python會評估(可能是惡意的)用戶決定輸入的任何表達。

另外,正如Sven Marnach正確指出的那樣,input在python 2.x中做了您所期望的。幸運的是,這已經在3.0中得到糾正,您必須使用它。

+0

這只是問題的一半。從輸出推斷輸入表明,OP可以有效地想要從用戶中讀取一個元組。 – delnan 2011-04-20 20:49:03

+0

@delnan,真 - 我添加了一些細節。 – senderle 2011-04-20 21:07:45

+0

另外,請注意unutbu關於'literal_eval'的評論。 – senderle 2011-04-20 21:14:40

0

你不明白數據和源代碼之間的區別。 pwm將保存你輸入的字符串,而不是元組。如果您將一個字符串放入列表函數中,您將返回一個包含字符串單個字符的列表。這就是你在輸出中獲得的。

0

您正在從字符串中創建字符串,然後將字符串轉換爲列表。你最終的結果是從字符串列表中看到什麼。

您在開始發佈的結果不是字符串,而是列表的呈現。是一覽。

0

我想你想

y = list(eval(npwn)) 
+3

Noooooooo! (以達斯維達的聲音)。避免這個! – user225312 2011-04-20 20:47:42

+0

顯然'eval'如果被濫用可能會很危險,但如果代碼永遠不會離開他的電腦,那麼它是無害的... – 2011-04-20 21:04:08

+1

就像手槍如果他們從不離開衣櫃一樣無害。是的,這是一個激烈的比喻。但是,不管如何嚴重危害計劃使用案例,都不應該教壞習慣(沒有適當的警告和指示)。不僅有一些原型將其投入生產,而且壞習慣還會繼續存在。 – delnan 2011-04-20 21:10:16

3

一個安全的(更嚴格的)替代使用evalast.literal_eval

import ast 
pwm = raw_input("enter PWM: ") 
y = list(ast.literal_eval(pwm)) 
print(y) 

運行

% test.py 
enter PWM: (7), (2), (1), (1), (6), (2), (1), (2), (1), (2), (2), (6) 

產生

[7, 2, 1, 1, 6, 2, 1, 2, 1, 2, 2, 6] 

注意這樣做可避免易碎(難以閱讀)的replace('),(',','),它只在逗號後沒有空格時才起作用。例如。 (7),(2)而不是(7), (2)

+0

+1,好點 - 我知道這樣的東西存在,但我不記得在哪裏。 – senderle 2011-04-20 21:15:17

+0

很酷。感謝您指出ast.literal_eval函數。我不知道存在! – drbunsen 2011-04-20 21:53:06