如果循环 x 次,计算列表项通过次数的公式是什么
What is the formula to count number of passes of a list items if cycled x times
给出
list =['a','b','c']
如何在循环列表 x 次时获取项目被访问的次数。例如:
# if we cycled list 4 times, output would be
output = [('a',2), ('b',1), ('c',1)]
# if we cycled list 7 times, output would be
output = [('a',3), ('b',2), ('c',2)]
是否有公式,或者是否需要循环?
这可能不是最好的方法,但您可能会发现它仍然有用。这个想法是找到扩展列表,然后使用 Counter
来获得出现频率
from collections import Counter
n = 7
listt = ['a','b','c']
a = n%len(listt)
b = int(n/len(listt))
listt = listt*b + listt[0:a]
result = [(i, j) for i,j in Counter(listt).items()]
print (result)
# [('a', 3), ('b', 2), ('c', 2)]
可以简单的用链表的长度除以循环次数,索引小于余数的元素加1:
def nb_accesses(sequence, loops):
length = len(sequence)
out = [(value, loops // length + (index < loops % length))
for index, value in enumerate(sequence)]
return out
sequence = ['a', 'b', 'c']
print(nb_accesses(sequence, loops=0))
# [('a', 0), ('b', 0), ('c', 0)]
print(nb_accesses(sequence, loops=3))
# [('a', 1), ('b', 1), ('c', 1)]
print(nb_accesses(sequence, loops=5))
# [('a', 2), ('b', 2), ('c', 1)]
index < loops % length
计算结果为 0(假)或 1(真)。
您可以部分地计算它,但是对于这种方法在某些时候需要一个循环。使用楼层除法找出完成了多少遍,然后将其余部分递增 1(从左侧开始)- 未完成的遍数:
data = ['a', 'b', 'c']
cycles = 7
complete_passes, remainder = divmod(cycles, len(data))
passes = {i: complete_passes for i in data}
for key in data[:remainder]:
passes[key] += 1
关于divmod
的注释:
divmod(x, y)
...returns...
(x//y, x%y)
# floor division, modulus
我们访问列表中第 k 个项目的次数 n 个项目,v 访问次数为⌈(v-k)/n⌉,相当于⌊(v-k+n-1)/n⌋。毕竟我们进行了 v 次访问,这意味着每个项目至少有 ⌊v/n-1⌋ 次访问。最后一个"round"分配剩下的v - ⌊v/n-1⌋,第一个v - ⌊v/n-1⌋ 项 "retrieve" 一次访问。
我们可以在线性时间内生成这样的列表:
def visit_count(data, v):
n = len(data)
return [(x, (v-i+n-1)//n) for i, x in enumerate(data)]
例如:
>>> visit_count('abc', 7)
[('a', 3), ('b', 2), ('c', 2)]
>>> visit_count('abc', 8)
[('a', 3), ('b', 3), ('c', 2)]
>>> visit_count('abc', 9)
[('a', 3), ('b', 3), ('c', 3)]
>>> visit_count('abc', 10)
[('a', 4), ('b', 3), ('c', 3)]
由于这个跑的是榜单的长度,而不是访问的次数,也就是说我们可以通过合理的榜单,以及巨大的访问量来解决这个问题。例如:
>>> visit_count('abcde', 1_234_567_890_123_456)
[('a', 246913578024692), ('b', 246913578024691), ('c', 246913578024691), ('d', 246913578024691), ('e', 246913578024691)]
单独对 1'234'567'890'123'456 次访问进行簿记会导致函数需要很长时间才能获得结果。但是由于元素的数量(这里是5个)有限,所以只需要几微秒。
给定
import itertools as it
import collections as ct
lst = list("abc")
n = 7
代码
iterable = (it.islice(it.cycle(lst), n)
[(k, v) for k, v in ct.Counter(iterable).items()]
# [('a', 3), ('b', 2), ('c', 2)]
给出
list =['a','b','c']
如何在循环列表 x 次时获取项目被访问的次数。例如:
# if we cycled list 4 times, output would be
output = [('a',2), ('b',1), ('c',1)]
# if we cycled list 7 times, output would be
output = [('a',3), ('b',2), ('c',2)]
是否有公式,或者是否需要循环?
这可能不是最好的方法,但您可能会发现它仍然有用。这个想法是找到扩展列表,然后使用 Counter
来获得出现频率
from collections import Counter
n = 7
listt = ['a','b','c']
a = n%len(listt)
b = int(n/len(listt))
listt = listt*b + listt[0:a]
result = [(i, j) for i,j in Counter(listt).items()]
print (result)
# [('a', 3), ('b', 2), ('c', 2)]
可以简单的用链表的长度除以循环次数,索引小于余数的元素加1:
def nb_accesses(sequence, loops):
length = len(sequence)
out = [(value, loops // length + (index < loops % length))
for index, value in enumerate(sequence)]
return out
sequence = ['a', 'b', 'c']
print(nb_accesses(sequence, loops=0))
# [('a', 0), ('b', 0), ('c', 0)]
print(nb_accesses(sequence, loops=3))
# [('a', 1), ('b', 1), ('c', 1)]
print(nb_accesses(sequence, loops=5))
# [('a', 2), ('b', 2), ('c', 1)]
index < loops % length
计算结果为 0(假)或 1(真)。
您可以部分地计算它,但是对于这种方法在某些时候需要一个循环。使用楼层除法找出完成了多少遍,然后将其余部分递增 1(从左侧开始)- 未完成的遍数:
data = ['a', 'b', 'c']
cycles = 7
complete_passes, remainder = divmod(cycles, len(data))
passes = {i: complete_passes for i in data}
for key in data[:remainder]:
passes[key] += 1
关于divmod
的注释:
divmod(x, y)
...returns...
(x//y, x%y)
# floor division, modulus
我们访问列表中第 k 个项目的次数 n 个项目,v 访问次数为⌈(v-k)/n⌉,相当于⌊(v-k+n-1)/n⌋。毕竟我们进行了 v 次访问,这意味着每个项目至少有 ⌊v/n-1⌋ 次访问。最后一个"round"分配剩下的v - ⌊v/n-1⌋,第一个v - ⌊v/n-1⌋ 项 "retrieve" 一次访问。
我们可以在线性时间内生成这样的列表:
def visit_count(data, v):
n = len(data)
return [(x, (v-i+n-1)//n) for i, x in enumerate(data)]
例如:
>>> visit_count('abc', 7)
[('a', 3), ('b', 2), ('c', 2)]
>>> visit_count('abc', 8)
[('a', 3), ('b', 3), ('c', 2)]
>>> visit_count('abc', 9)
[('a', 3), ('b', 3), ('c', 3)]
>>> visit_count('abc', 10)
[('a', 4), ('b', 3), ('c', 3)]
由于这个跑的是榜单的长度,而不是访问的次数,也就是说我们可以通过合理的榜单,以及巨大的访问量来解决这个问题。例如:
>>> visit_count('abcde', 1_234_567_890_123_456)
[('a', 246913578024692), ('b', 246913578024691), ('c', 246913578024691), ('d', 246913578024691), ('e', 246913578024691)]
单独对 1'234'567'890'123'456 次访问进行簿记会导致函数需要很长时间才能获得结果。但是由于元素的数量(这里是5个)有限,所以只需要几微秒。
给定
import itertools as it
import collections as ct
lst = list("abc")
n = 7
代码
iterable = (it.islice(it.cycle(lst), n)
[(k, v) for k, v in ct.Counter(iterable).items()]
# [('a', 3), ('b', 2), ('c', 2)]