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

时间:2012-11-02 23:19:03

标签: 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', '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”时遇到麻烦,并在其他迭代中继续使用“+”,但这只是给了我一个很长的所有字符列表而不是字符的子列表列表。感谢您提供任何帮助或建议。

7 个答案:

答案 0 :(得分:9)

内置list()函数从可迭代对象创建列表。由于字符串是可迭代对象,因此我们可以将其传递给list()以创建单个字符的列表。要对每个单词执行此操作,我们可以使用list comprehension

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

答案 1 :(得分:3)

>>> 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只使用字符串将其视为迭代器,因此最终它包含字母(如果字符串被迭代,则字符串会将字母作为元素)。

答案 2 :(得分:1)

您可以简单地将字符串强制转换为列表,以获取字符串字符的列表。

words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
split_words = [list(word) for word in li]

答案 3 :(得分:1)

现有代码不起作用的唯一原因是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])]

如果索引range(len(first_list))所需的全部是i,则循环first_list[i]会有点愚蠢。你可以直接循环first_list。 (即使你 需要i用于其他目的,你也可以循环enumerate(first_list)。)

然而,正如许多人所指出的那样,使用列表推导几乎总是比尝试使用显式循环构建列表更好。

事实上,其中一个原因是您不必记住appendextend,其中函数mutate并返回新值,依此类推。

答案 4 :(得分:0)

这样做:

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

答案 5 :(得分:0)

您可以使用list()

map应用于每个项目
>>> 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']]

虽然我不确定你为什么需要这样做。字符串和列表的行为几乎相同。

答案 6 :(得分:0)

您当前的解决方案不起作用,因为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))

但是,最好的方法是使用列表推导或地图,就像在其他答案中一样。