在Python中将'[a, b, c]'形式的字符串转换为列表,且不使用列表推导式

2 投票
5 回答
5612 浏览
提问于 2025-04-18 11:51

Python初学者的问题:

有没有办法把形如 '[a, b, c]' 的字符串直接转换成一个列表?

也就是说,像这样 type(f('[a, b, c]')) 是 list == True 或者 isinstance(f('[a, b, c]'), list) 是 True,对于某个方法或函数 f 来说?请注意,最终的列表应该是每个元素都是单独的字符串,也就是 f('[a, b, c]') 返回 ['a', 'b', 'c']

我查过 这个这个ast.literal_eval() 出现错误:

ValueError: malformed string

我的输入列表(字符串)没有unicode标记,里面的项目也不是单独的 stringint

有没有内置的方法可以进行这种转换?这基本上是一个“形式”问题。我想知道有没有一种“Pythonic”的方式来做到这一点,而不需要写一个比较长的函数来分割字符串和转换。

任何见解都将非常感谢。

5 个回答

0

是的,有一种方法可以直接把字符串 "[a,b,c]" 转换成一个列表:

a="hello"
b=" "
c="world"

lststr = "[a,b,c]"

# now 'exec()' can be used for declaring a variable 
# and assigning string 'lststr' to it as a list variable

exec("lstvar = "+lststr)
0

使用 literal_eval 这个方法可以让整数保持为整数,并且保留子列表。

In [7]: import re

In [8]: d='[a, b, c, 4, 5, 6,[1,4]]'

In [9]: from ast import literal_eval

In [10]: lit = literal_eval(re.sub('([A-Za-z])', r'"\1"', d))

In [11]: lit[6]
Out[11]: [1, 4]

In [12]: type(lit[6])
Out[12]: list

In [13]: lit
Out[13]: ['a', 'b', 'c', 4, 5, 6, [1, 4]]

如果你想把数字和字母混合在一起,你需要把所有的整数也转换成字符串。

你还可以在模式中添加内容,以找到包含 @. 的字符串:

In [16]: d='[a, ba, c, 4, 5, 6,[1,4],me@you.com]'

In [17]: lit = literal_eval(re.sub('([A-Za-z@.])', r'"\1"', d))

In [18]: lit
Out[18]: ['a', 'ba', 'c', 4, 5, 6, [1, 4], 'me@you.com']
0

这样就可以了:

s = '[a, b, c]'
s = s[1:-1]
s = s.split(', ')

或者你也可以用一行代码来实现:

s = s[1:-1].split(', ')
1

我知道提问者明确要求不要使用列表推导式的解决方案,不过为了那些可能对使用列表推导式的解决方案感兴趣的人,我在这里提供这段代码:

>>> s = "[a, 1, b]"
>>> s = [int(i) if i.strip().isdigit() else i.strip() for i in s[1:-1].split(",")]
>>> print(s)
 ['a', 1, 'b']

这段代码还考虑了元素的类型,整数会被转换成 int 类型。

2

试试这个:

s = '[a ,b, c]'
s = s.replace(" ", "")
l = s[1:-1].split(',')

撰写回答