帮助理解列表功能

时间:2011-04-20 20:39:44

标签: python

当我在解释器中输入以下内容时,我得到了所需的输出行为:

>>> 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)  

5 个答案:

答案 0 :(得分: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]

有些人建议在eval返回的字符串上使用input。虽然这会做你想要的,但这是一个非常糟糕的习惯,因为python将评估(可能是恶意的)用户决定输入的任何表达。

另外,正如Sven Marnach正确指出的那样,input在python 2.x中完成了你的期望。幸运的是,已经在3.0中更正了,您必须使用它。

答案 1 :(得分:3)

使用eval的安全(限制性更强)替代方法是ast.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)

答案 2 :(得分:0)

您无法区分数据和源代码。 pwm将保存您键入的字符串,而不是元组。如果将一个字符串放入list函数中,您将返回一个包含字符串单个字符的列表。这就是你在输出中得到的结果。

答案 3 :(得分:0)

您正在从字符串中创建字符串,然后将字符串转换为列表。您认为最终结果是字符串列表。

您在开头发布的结果不是字符串,而是列表的演示文稿。这是清单。

答案 4 :(得分:0)

我想你想要

y = list(eval(npwn))