2012-11-02 120 views
1

所以我开始:如何将字符串列表转换为字符串中各个字符的子列表列表?

['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”对象有没有属性“追加”:

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”烦恼,并保持在其他迭代使用‘+’,但只是给了我所有的一长串字符而不是字符的子列表。感谢您的任何帮助或建议。

+0

相关如果不重复http://stackoverflow.com/questions/113655/is-there-a-function-in-python-to-split-a-word-into-a-list –

回答

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()方法返回无。由于您将方法的输出分配给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

这是一个'AttributeError' ,而不是'SyntaxError'。 (不过+1是不仅是一个列表理解的第一项建议,但解释为什么要使用一个,给了一个链接的唯一一个。) – abarnert

+0

@abarnert谢谢,固定。 – Blair

+0

谢谢你解释什么是我的错误了。谢谢大家的帮助。 –

1

您可以简单地将字符串强制到列表中以获取字符串的字符列表。

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

通过他所尝试的方式来判断,他对“list(word)”部分没有任何问题,但将所有结果放在一起(普通列表理解)。 – abarnert

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

虽然我不知道为什么你需要做到这一点。字符串和列表的行为几乎完全相同。

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只是将字符串作为迭代器使用,所以最终它包含字母(如果字符串正在被迭代,字符串会产生字母)。

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

但要做到这一点的最好办法就像使用其他答案一样使用列表理解或映射。

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))如果你想要用食指ifirst_list[i];你能刚刚超过first_list直接循环。 (即使你需要i用于其他目的,你也可以遍历enumerate(first_list)

然而,正如许多人所指出的那样,它几乎总是更好地使用列表理解,而不是试图建立名单以明确的循环。

事实上,其中很多原因之一是您不必记住appendextend,其中函数mutate和返回新值,等等。