2016-11-23 12 views
1

のインデックスにマッピングされたスライスされたリスト内の要素の出現の合計を探す:私は次のリスト持っている要素

my_list=['John', 'John', 'John', 'John', 'Joe', 'Joe', 'Kevin', 'Kevin', 'Bryan'] 

を私はのすべての出現の合計をカウントするために使用される新しいリストを作成したいですmy_listがmy_listの一意の値を反復処理します。繰り返しは、my_listの最初の項目から開始し、my_list内のすべての項目を調べる必要があります。

例えば、私はこのようになりますリストをしたい:

[1, 2, 3, 4, 1, 2, 1, 2, 1] 
+0

リストは '[「ジョン」、「ジョン」、「ジョン」、「ジョンだったら'ジョー'、 'ジョー'、 'ケビン'、 'ケビン'、 'ブライアン'、 'ジョン'] 'の場合、結果は[1,2,3,4,1,2,1,2、 1、1] 'または' [1,2,3,4,1,2,1,2,1,5] '?言い換えれば、シーケンシャルオカレンスをそのポイントまで、またはそのポイントまでのすべてのオカレンスの合計にしたいですか? – SethMMorton

+0

[現在受け付けている回答](http://stackoverflow.com/a/40754341/1399279)は後者を行います。テキストの中の単語は、前者が必要であることを示しています。 – SethMMorton

+0

@SethMMortonは現在のところ質問に指定されていないので、あなたの回答を削除しないことをお勧めします。これは良いものです。単に前提を追加するだけです。 –

答えて

2

あなたはリスト内包と一緒にスライスされたリスト上の単語の出現を見つけるためにlist.count()を使用することがあります。

>>> my_list= ['John', 'John', 'John', 'John', 'Joe', 'Joe', 'Kevin', 'Kevin', 'Bryan'] 
>>> [my_list[:i].count(name) for i, name in enumerate(my_list, 1)] 
[1, 2, 3, 4, 1, 2, 1, 2, 1] 

ここで、my_list[:i].count(name)は、nameの出現回数をに、0番地からi番目のインデックス(01の値を除く番目のインデックス)。 enumerate()について知りたい場合は、documentを参照してください。私はにiの値が1から始まることを意味する列挙型を渡しています。

例スライスに関連して数える:

>>> my_list[:6]  # Values upto `5`th index 
['John', 'John', 'John', 'John', 'Joe', 'Joe'] 
>>> my_list[:6].count('John') # occurence of `John` in the list 
4 

編集:forループにこのリスト内包表記表現の同等の変換は次のようになります。ここでは

my_count = []    # v Means index `i` starting from `1` 
for i, name in enumerate(my_list, 1): 
    word_count = my_list[:i].count(name) 
    my_count.append(word_count) 

my_countは、リストcomprehensによって再調整された同じ値を保持しますイオン。

一つの方法は、同時に、リストの各繰り返しでカウントを発生させながら Counterを構築することです
+1

私は 'my_list [:i] .count(name)'についてのあなたの説明のファンではありません、それは 'i'を含むまでカウントしません。 'start = 1'を' enumerate'に指定します。誰かがこれをすでに理解していればうまくいきますが、なぜそれが働いているのかはすぐに分かりません。 –

+1

@ TadhgMcDonald-Jensen:それをもう一度見てから。私もあなたが正しいことを理解しています。答えを更新しました。今私はそれが明らかであると思う。私にあなたの考えを教えてください:) –

+1

あなたの例では 'i'に別の値を使います。あなたは 'i = 3'を持っています。これはリストの長さと等しくなり、countのために返された数です。それは混乱することがあります。長さ5のリストに対して 'i = 4'を試してください。 – pylang

1

from collections import Counter 

def stepped_counter(sequence): 
    seen = Counter() 
    for item in sequence: 
     seen[item]+=1 #add in the item 
     yield seen[item] #generate the current count of this item 

>>> my_list= ['John', 'John', 'John', 'John', 'Joe', 'Joe', 'Kevin', 'Kevin', 'Bryan'] 
>>> list(stepped_counter(my_list)) 
[1, 2, 3, 4, 1, 2, 1, 2, 1] 
+0

これはきれいな方法です。 – pylang

関連する問題