帮助理解列表函数

2024-10-03 02:41:46 发布

您现在位置: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)  

Tags: 答案代码列表input键入解释器replacelist
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)。你知道吗

你不知道数据和源代码之间的区别。pwm将保存您键入的字符串,而不是元组。如果您将一个字符串放入list函数,您将得到一个包含该字符串的单个字符的列表。这就是你的产出。你知道吗

当您对字符串调用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会计算用户决定输入的任何表达式(可能是恶意的)。你知道吗

另外,正如svenmarnach正确指出的,input实现了python2.x中所期望的功能。幸运的是,3.0中已经纠正了这一点,您必须使用它。你知道吗

相关问题 更多 >