繁体   English   中英

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

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

如果想要索引ifirst_list[i] ,那么遍历range(len(first_list))有点愚蠢; 您可以直接在first_list循环。 (即使您确实需要i用于其他目的,也可以遍历enumerate(first_list) 。)

但是,正如许多人指出的那样,使用列表理解几乎总是比尝试使用显式循环构建列表更好。

实际上,造成这种情况的众多原因之一是,您不必记住appendextend ,函数会发生变化,返回新值等等。

这样可以:

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

您可以使用maplist()应用于每个项目:

>>> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM