2016-11-23 86 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)將給出的發生次數namemy_list0 th到i th指數(不包括01的值th index)。要了解enumerate(),請參閱document。我通過start = 1與枚舉這意味着價值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將保持相同的價值,這是由列表包括回顧離子。

+1

我不是你對'my_list [:i] .count(name)'的解釋迷,它不包括'i',它只是讓'i'一個索引更進一步,然後當前迭代通過指定一個'start = 1'到'enumerate'。這很好,如果有人已經理解這一點,但它不明顯,爲什麼它的工作。 –

+1

@ TadhgMcDonald-Jensen:在第二次看後。我也意識到你是對的。更新了答案。我想現在看來很清楚。讓我知道你的想法:) –

+1

在你的例子中爲'i'使用不同的值。你有'我= 3',恰好等於列表的長度和計數返回的數字。它可能會讓人困惑。嘗試'我= 4'的長度列表5. – pylang

1

辦法之一是建立一個Counter同時以列表的每次迭代產生的計數:

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