我有以下列表:
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 :(得分: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)
name
中my_list
的出现次数从0
到i
索引(不包括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]