查找映射到元素索引的切片列表中元素的出现总和

时间:2016-11-23 00:54:08

标签: python list

我有以下列表:

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]

2 个答案:

答案 0 :(得分:2)

您可以使用list.count()查找切片列表中单词的出现以及列表理解

self._Save_model.save(sess,'/checkpoints' + 'model.ckpt')

在此处,>>> 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_list的出现次数从0i索引(不包括i的值1}}索引)。要了解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 :(得分: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]