Python 在两个列表之间计数频率而不计数的替代方法
我创建了以下代码来检查第一个列表与第二个列表的频率,而不使用count:Python 在两个列表之间计数频率而不计数的替代方法,python,list,while-loop,Python,List,While Loop,我创建了以下代码来检查第一个列表与第二个列表的频率,而不使用count: F = [4,7,2] N = [2,3,4,2,5,6,3,2,6,7,3,4] frequency = [0,0,0] for i in range(len(F)): for num in N: if F[i] == num: frequency[i]+=1 print('4 occurs in N', frequency[0], 'times') print('7 oc
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
frequency = [0,0,0]
for i in range(len(F)):
for num in N:
if F[i] == num:
frequency[i]+=1
print('4 occurs in N', frequency[0], 'times')
print('7 occurs in N', frequency[1], 'times')
print('2 occurs in N', frequency[2], 'times')
print()
代码正确输出:
4 occurs in N 2 times
7 occurs in N 1 times
2 occurs in N 3 times
是否有其他方法不使用
计数
?我尝试了一个循环,但没有成功。感谢您的帮助。首先,计数器经过高度测试,效率高,是STL的一部分,请使用它
>>> from collections import Counter
>>> Counter([2,3,4,2,5,6,3,2,6,7,3,4])
Counter({2: 3, 3: 3, 4: 2, 6: 2, 5: 1, 7: 1})
其次,您可以建立自己的:
def counter(sequence):
counts = {}
for item in sequence:
counts[item] = counts.get(item, 0) + 1
return counts
样本输出:
>>> counter([2,3,4,2,5,6,3,2,6,7,3,4])
{2: 3, 3: 3, 4: 2, 5: 1, 6: 2, 7: 1}
>>> counter([4,7,2])
{2: 1, 4: 1, 7: 1}
你说“不使用计数”,所以我认为这符合要求:
from collections import Counter
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
counter = Counter(N)
for n in F:
print(n, 'occurs in N', counter[n], 'times')
您可以使用字典来存储频率:
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
# Create the initial frequency dictionary
frequency = {}
for item in F:
frequency[item] = 0
# Count the occurences
for item in N:
if item in frequency:
frequency[item] += 1
# Print the occurences
for item in F:
print('{} occurs in N {} times'.format(item, frequency[item]))
print()
或者,如果您希望它更短:
frequency = dict.fromkeys(N, 0)
for item in N:
frequency[item] += 1
for item in F:
print('{} occurs in N {} times'.format(item, frequency[item]))
print()
您可以使用set以高性能实现这一点
from collections import defaultdict
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
set_f = set(F)
freq = defaultdict(int)
for num in N:
if num in set_f:
freq[num] += 1
print freq
塔达
Out: defaultdict(<type 'int'>, {2: 3, 4: 2, 7: 1})
Out:defaultdict(,{2:3,4:2,7:1})
在本文中将来自多个用户的解决方案分组,以便轻松找到它们
解决方案1:collections.Counter
解决方案2:list.count()
解决方案3:用于
循环
“不使用计数”是什么意思?你是指序列中的.count(item)
方法吗?他的意思是集合.count
type@Adirio这是collections.Counter
,而不是collections.Count
。是的,没有使用Count或Counter,这只是一个练习,我在现实世界中没有使用它,只是为了学习其他方法,只是一个输入错误,我仍然认为他指的是它。我知道计数器工作得很好,我想尝试不使用计数器,谢谢你可以自己制作,正如我在第二个示例中所示;)@超新星谢谢你的建议有没有办法不用柜台?使用while?我添加了一些优化作为编辑,请接受它们。他们使用dict理解进行初始创建,并使用dict视图进行初始创建printing@Adirio打印是故意这样做的,因为这样可以保证打印的顺序正确(3.6之前的dicts是无序的,所以没有其他的顺序)。字典理解不必要地复杂,如果应该更短或更快,那么总是有frequency=dict.fromkeys(F,0)
这真的很好,只是一个问题,你知道为什么while不起作用吗?我在尝试我的代码的变体,就像上面你的一样,regards@Supernova您的代码没有包含while
循环,因此我无法说明它为什么不起作用。抱歉。没问题,我只发布了我使用时有效的代码,而它不起作用,因此,这是不使用计数器的最有效的方法。set
s不需要这样做,为什么不将其保留为列表
?@adrio:如果执行查找,列表会增加时间复杂性。你需要使用集合。当前示例是一个小场景。但是使用set而不是list进行查找是一种著名的编程实践。
中的比list
(O(n))对set
(O(1))的处理速度要快得多。从list创建set会增加开销,而不仅仅是理论上的复杂性评估。对于查找时间增加的大型列表,这种开销可以忽略不计,但对于这种情况,我非常怀疑这种开销是否小于改进的查找时间。
from collections import Counter
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
times = Counter(N)
for each in F:
print("{} occurs in N {} times".format(each, times[each]))
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
for each in F:
print("{} occurs in N {} times".format(each, N.count(each)))
F = [4,7,2]
N = [2,3,4,2,5,6,3,2,6,7,3,4]
times = {each: 0 for each in F}
for each in N:
if each in times:
times[each] += 1
for item, frequency in times.items():
print("{} occurs in N {} times".format(item, frequency))