[英]how to convert a list of strings into a list of sublists of the individual characters in the strings?
所以我开始:
['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:'NoneType'对象没有属性'append':
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”时一直遇到麻烦,在其他迭代中仍然使用“ +”,但这只是给了我所有字符的长列表,而不是字符子列表的列表。 感谢您的帮助或建议。
内置的list()
函数从可迭代对象创建列表。 由于字符串是一个可迭代的对象,我们可以将其传递给list()
以创建各个字符的列表。 为此,我们可以使用列表推导 :
>>> words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
>>> [list(word) for word in 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']]
编辑:您得到的属性错误是因为列表的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']]
>>> 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
仅使用将其视为迭代器的字符串,因此最终它包含字母(因为如果对其进行迭代,则字符串会将字母作为元素生成)。
您可以简单地将字符串强制转换为列表,以获取字符串的字符列表。
words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
split_words = [list(word) for word in li]
现有代码不起作用的唯一原因是list.append
修改了一个列表,并返回None
。 所以:
for i in range (len(first_list)):
list_1 = list_1.append(list(first_list[i]))
第一次,您将第一个单词添加到list_1上,然后将list_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_list[i]
,那么遍历range(len(first_list))
有点愚蠢; 您可以直接在first_list
循环。 (即使您确实需要i
用于其他目的,也可以遍历enumerate(first_list)
。)
但是,正如许多人指出的那样,使用列表理解几乎总是比尝试使用显式循环构建列表更好。
实际上,造成这种情况的众多原因之一是,您不必记住append
与extend
,函数会发生变化,返回新值等等。
这样可以:
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']]
尽管我不确定为什么您需要这样做。 字符串和列表的行为几乎相同。
您当前的解决方案不起作用,因为list.append()
返回None
,并且您将list_1.append()
的结果分配回list_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))
但是,执行此操作的最佳方法是使用列表理解或映射,如其他答案所示。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.