2016-11-23 87 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