2011-04-20 42 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