计算lis中的重复次数

2024-05-18 10:08:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试构造这个函数,但是我不知道如何停止函数多次计算相同的重复项。有人能帮我吗?

def count_duplicates(seq): 

    '''takes as argument a sequence and
    returns the number of duplicate elements'''

    fir = 0
    sec = 1
    count = 0
    while fir < len(seq):
        while sec < len(seq):
            if seq[fir] == seq[sec]:
                count = count + 1
            sec = sec + 1
        fir = fir + 1
        sec = fir + 1
    return count 

输入:count_duplicates([-1,2,4,2,0,4,4])

输出:4

它在这里失败,因为输出应该是3


Tags: and函数lendefascountsecargument
3条回答

您只需从列表中创建一个set,它将自动删除重复项,然后计算创建的集合和原始列表的长度之差。 就像这样:

def count_duplicates(seq): 

    '''takes as argument a sequence and
    returns the number of duplicate elements'''

    return len(seq) - len(set(seq))

res = count_duplicates([-1,2,4,2,0,4,4])
print(res)  # -> 3

如果您不被允许或不想使用任何内置快捷方式(无论出于何种原因),您可以使用long(er)方式:

def count_duplicates2(seq): 

    '''takes as argument a sequence and
    returns the number of duplicate elements'''

    counter = 0
    seen = set()
    for elm in seq:
        if elm in seen:
            counter += 1
        else:
            seen.add(elm)
    return counter

res = count_duplicates2([-1,2,4,2,0,4,4])
print(res)  # -> 3

最后,就您的代码而言,@AlanB在his answer中很好地概述了它的问题。我选择不麻烦更正您的代码,因为在我看来这是一个XY Problem。显然,您有某种编程背景,但是您复杂的while循环只是而不是Python中的工作方式。

电动汽车的解决方案。在我看来,Kounis是最简单的,也是你应该使用的。但是,如果您想坚持您的代码,以下是它不起作用的原因:

通过复杂的while循环,您基本上可以说“对于我列表中的每个项,当您找到重复项时,递增count”,这基本上就是您想要的。但由于有两个“4个重复”,它会增加count一个额外的时间。

seq=[-1,2,4,2,0,4,4]
fir = 0
sec = 0
count = 0
print "Pairs of duplicates: "
for fir, item1 in enumerate(seq):
    for sec, item2 in enumerate(seq):
        if fir < sec and seq[fir] == seq[sec] :
            count+=1
            print(fir, sec)

print "Number of duplicates: ", count 

哪些输出:

Pairs of duplicates: 
(1, 3)
(2, 5)
(2, 6)
(5, 6)
Number of duplicates:  4

(5,6)对不正确。

要解决此问题,只需在if语句中添加一个条件,以防止对某个项进行两次比较:

seq=[-1,2,4,2,0,4,4]
fir = 0
sec = 0
count = 0
duplicates=[]
print "Pairs of duplicates: "
for fir, item1 in enumerate(seq):
    for sec, item2 in enumerate(seq):
        if fir < sec and seq[fir] == seq[sec] and seq[fir] not in duplicates:
            count+=1
            print(fir, sec)

    duplicates.append(seq[fir])

print "Number of duplicates: ", count

输出期望结果:

Pairs of duplicates: 
(1, 3)
(2, 5)
(2, 6)
Number of duplicates:  3

但是再一次,做

len(seq)-len(set(seq))

更简单,效果也一样。

编辑:

我意识到我的示例中没有使用while循环。

def count_duplicates(seq): 

    fir = 0
    sec = 0
    count = 0
    duplicates=[]
    print "Pairs of duplicates: "
    while fir < len(seq):
        while sec < len(seq):
            if fir < sec and seq[fir] == seq[sec] and seq[fir] not in duplicates:
                count += 1
                print(fir, sec)
            sec += 1
        duplicates.append(seq[fir])
        fir += 1
        sec = 0
    return count 


c=count_duplicates([-1,2,4,2,0,4,4])
print "Number of duplicates: ", c

接近熊猫。此方法适用于具有重复项的大列表。

data = [-1,2,4,2,0,4,4]
import pandas as pd
df = pd.DataFrame({'data':data}) #Loading the data as Data Frame
print(df[df1==False]) #Printing Non-Duplicated Values
   data
0    -1
1     2
2     4
4     0
print(df[df1==False].count()) #Taking count of Non-Duplicate Values
data    4
dtype: int64

相关问题 更多 >