Python 在两个列表之间计数频率而不计数的替代方法

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

我创建了以下代码来检查第一个列表与第二个列表的频率,而不使用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 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))