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