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'オブジェクトには属性がありません'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」の使用に問題があり、他の反復では「+」を使用し続けますが、文字のサブリストではなく、すべての文字の長いリストが表示されます。ヘルプやアドバイスをありがとうございます。

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()は、リストのメソッドが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']]
于 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

既存のコードが機能しない唯一の理由は、その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_listienumerate(first_list)

しかし、多くの人が指摘しているように、ほとんどの場合、明示的なループでリストを構築しようとするよりも、リスト内包表記を使用する方が優れています。

実際、その多くの理由の 1 つは、どの関数が変更され、どの関数が新しい値を返すかなど、 appendvs.を覚えておく必要がないことです。extend

于 2012-11-02T23:29:51.343 に答える
1

文字列を強制的にリストに入れるだけで、文字列の文字のリストを取得できます。

words = ['BLUE', 'ORANGE', 'YELLOW', 'GREEN', 'BLACK', 'PURPLE', 'BROWN']
split_words = [list(word) for word in li]
于 2012-11-02T23:24:52.097 に答える
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()を返すため、現在のソリューションは機能しません。 backNoneの結果を に割り当てているため、2 回目の反復で属性エラーが発生します。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 に答える