2

所以我开始:

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

4

7 回答 7

11

内置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()列表的方法返回无。由于您将方法的输出分配给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']]
于 2012-11-02T23:23:30.580 回答
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,只需将字符串视为迭代器,因此最终它包含字母(因为字符串在迭代时将字母作为元素产生)。

于 2012-11-02T23:27:23.733 回答
1

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

words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
split_words = [list(word) for word in li]
于 2012-11-02T23:24:52.097 回答
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)。)

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

事实上,造成这种情况的众多原因之一是您不必记住appendvs. extend,哪些函数会发生变异,哪些会返回新值,等等。

于 2012-11-02T23:29:51.343 回答
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']]
于 2012-11-02T23:25:31.940 回答
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']]

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

于 2012-11-02T23:27:08.463 回答
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))

但是最好的方法是使用列表理解或映射,就像其他答案一样。

于 2012-11-02T23:28:59.390 回答