Python 如何将字符串列表转换为字符串中单个字符的子列表?

Python 如何将字符串列表转换为字符串中单个字符的子列表?,python,list,append,sublist,Python,List,Append,Sublist,因此,我从以下几点开始: ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN'] 我想: [['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'], ['G', 'R', 'E', 'E', 'N'], ['B','L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L',

因此,我从以下几点开始:

['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
我想:

[['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'], ['G', 'R', 'E', 'E', 'N'], ['B','L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L', 'E'], ['B', 'R', 'O', 'W','N']]
我尝试了这个,因为它看起来会产生我想要的,但它一直告诉我我有一个错误。AttributeError:“非类型”对象没有属性“附加”:

first_list = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
list_1 = []

for i in range (len(first_list)):
    list_1 = list_1.append(list(first_list[i]))

return list_1
在其他迭代中,我一直在使用“.append”和“+”时遇到问题,但这只会给我一个所有字符的长列表,而不是字符的子列表。感谢您的帮助或建议。

内置函数可从iterable对象创建列表。因为字符串是一个iterable对象,所以我们可以将它传递给
list()
,以创建单个字符的列表。要对每个单词执行此操作,我们可以使用:

编辑:您得到的属性错误是因为列表的
append()
方法返回None。由于将方法的输出分配给
list1
变量,因此在循环的第一时间就用None覆盖列表。由于None没有
append
方法,因此下次循环时会出现错误。删除此分配将使代码正常工作:

>>> first_list = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
>>> list_1 = []
>>> for i in range (len(first_list)):
...     list_1.append(list(first_list[i]))
... 
>>> list_1
[['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'], ['G', 'R', 'E', 'E', 'N'], ['B', 'L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L', 'E'], ['B', 'R', 'O', 'W', 'N']]

您可以简单地将一个字符串强制到一个列表中,以获得该字符串的字符列表

words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
split_words = [list(word) for word in li]
这将有助于:

myList = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']

res = [[i for i in s] for s in myList]

res
[['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'],    ['G', 'R', 'E', 'E', 'N'], ['B', 'L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L', 'E'], ['B', 'R', 'O', 'W', 'N']]
您可以使用
map
list()
应用于每个项目:

>>> words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
>>> map(list, words)
[['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'], ['G', 'R', 'E', 'E', 'N'], ['B', 'L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L', 'E'], ['B', 'R', 'O', 'W', 'N']]
虽然我不知道你为什么要这么做。字符串和列表的行为几乎相同

>>> map(list,first_list)
[['B', 'L', 'U', 'E'], ['O', 'R', 'A', 'N', 'G', 'E'], ['Y', 'E', 'L', 'L', 'O', 'W'], ['G', 'R', 'E', 'E', 'N'], ['B', 'L', 'A', 'C', 'K'], ['P', 'U', 'R', 'P', 'L', 'E'], ['B', 'R', 'O', 'W', 'N']]

列表
构造函数应用于原始列表的每个元素。原始列表的元素是字符串,它们是可编辑的。因此,
list
只是将字符串当作迭代器来使用,因此最终它包含字母(因为如果对字符串进行迭代,字符串会产生作为元素的字母)。

您当前的解决方案不起作用,因为
list.append()
返回
None
,并且您正在分配
list\u 1.append()的结果
返回到
列表1
,因此在第二次迭代中,您会得到属性错误

以下是修复当前代码的方法:

first_list = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
list_1 = []
for i in range(len(first_list)):
    list_1.append(list(first_list[i]))
更好的解决方案是直接循环列表中的项目:

for s in first_list:
    list_1.append(list(s))

但最好的方法是使用列表理解或映射,就像在其他答案中一样。

现有代码不起作用的唯一原因是
list.append
修改列表,并返回
None
。因此:

for i in range (len(first_list)):
    list_1 = list_1.append(list(first_list[i]))
第一次通过时,将第一个单词添加到列表_1中,然后将列表_1设置为
None
。因此,下一次通过时,您将得到一个
AttributeError

只要这样做:

for i in range (len(first_list)):
    list_1.append(list(first_list[i]))
或者使用一个函数,该函数不修改列表,而是返回一个新列表:

for i in range (len(first_list)):
    list_1 = list_1 + [list(first_list[i])]
如果索引
i
就是
first\u list[i]
的话,在
范围(len(first\u list))
上循环有点傻;您可以直接在
第一个\u列表上循环。(即使出于其他目的确实需要
i
,也可以循环
枚举(第一个列表)

然而,正如许多人所指出的,使用列表理解几乎总是比使用显式循环构建列表要好


事实上,其中一个原因是,你不必记住
append
extend
,哪些函数发生了变异,哪些函数返回了新的值,等等。

从他的尝试来看,他对
列表(word)
部分没有任何问题,而是把所有结果放在一起(琐碎的列表理解)。如果不重复,它是一个
属性错误
,而不是一个
语法错误
(仍然+1,因为它不仅是列表理解的第一个建议,而且是唯一一个解释为什么要使用它并给出链接的建议。)谢谢你解释我的错误,谢谢大家的帮助。
for i in range (len(first_list)):
    list_1 = list_1 + [list(first_list[i])]