Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我只需要在计算dict中重复整数的函数中返回大于1的值_Python - Fatal编程技术网

Python 我只需要在计算dict中重复整数的函数中返回大于1的值

Python 我只需要在计算dict中重复整数的函数中返回大于1的值,python,Python,这是我目前掌握的代码 def find_duplicate_integers(arg): stats = {} for i in arg: if i > 1: if i in stats: stats[i] += 1 else: stats[i] = 1 return stats 这就是我想要的结果 >>>

这是我目前掌握的代码

def find_duplicate_integers(arg):
     stats = {}
     for i in arg:
         if i > 1:
            if i in stats:
                 stats[i] += 1
            else:
                 stats[i] = 1
     return stats
这就是我想要的结果

>>> find_duplicate_integers([1, 1, 3, 2, 3, 1, 0])
{1: 3, 3: 2}
但这是我得到的结果

>>> find_duplicate_integers([1, 1, 3, 2, 3, 1, 0])
{2: 1, 3: 2}

我很抱歉,如果这是由于一个基本的错误,但我不知道如何使这项工作。任何帮助都将不胜感激

使用
itertools
中的
groupby

from itertools import groupby
def find_duplicate_integers(numberlist, minimum=1):
    repeats = dict([(a, sum(1 for _ in b)) for a, b in groupby(sorted(numberlist))])
    return dict((a, b) for a, b in repeats.items() if b > minimum)

print(find_duplicate_integers([1, 1, 3, 2, 3, 1, 0]))  # => {1: 3, 3: 2}
print(find_duplicate_integers([1, 1, 3, 2, 3, 1, 0], minimum=3))  # => {1: 3}
与@caenyon的解决方案相比。我的职责是1他的职责是2


随着大小的增加,它会逐渐变慢。

使用
itertools
中的
groupby

from itertools import groupby
def find_duplicate_integers(numberlist, minimum=1):
    repeats = dict([(a, sum(1 for _ in b)) for a, b in groupby(sorted(numberlist))])
    return dict((a, b) for a, b in repeats.items() if b > minimum)

print(find_duplicate_integers([1, 1, 3, 2, 3, 1, 0]))  # => {1: 3, 3: 2}
print(find_duplicate_integers([1, 1, 3, 2, 3, 1, 0], minimum=3))  # => {1: 3}
与@caenyon的解决方案相比。我的职责是1他的职责是2


随着尺寸的增加,速度会逐渐变慢。

实际上,您可以在一行中完成:

def find_duplicate_integers(arg):
    return {i: arg.count(i) for i in set(arg) if arg.count(i) > 1}
如果您关心运行时,可能会有更快的方法

编辑:

如果您需要速度非常快,可以这样做:

from collections import defaultdict
from random import SystemRandom
from timeit import Timer


def find_duplicate_integers3(arg):
    d = defaultdict(lambda: 0)
    for i in arg:
        d[i] += 1
    return {k: v for k, v in d.items() if v > 1}

rdev = SystemRandom()
numberList = [rdev.randint(0, 10 ** 3) for _ in range(1000)]

t1 = Timer(lambda: find_duplicate_integers3(numberList))  # Mine
t2 = Timer(lambda: find_duplicate_integers1(numberList))  # Goodies's
print(t1.timeit(number=1000))  # => 0.42611347176268827
print(t2.timeit(number=1000))  # => 1.0357027557108174
编辑2:


正如donkopotamus所指出的,有一种更好(更快)的方法来做这件事:
收集。计数器

def find_duplicate_integers(arg):
    return {i: arg.count(i) for i in set(arg) if arg.count(i) > 1}
如果您关心运行时,可能会有更快的方法

编辑:

如果您需要速度非常快,可以这样做:

from collections import defaultdict
from random import SystemRandom
from timeit import Timer


def find_duplicate_integers3(arg):
    d = defaultdict(lambda: 0)
    for i in arg:
        d[i] += 1
    return {k: v for k, v in d.items() if v > 1}

rdev = SystemRandom()
numberList = [rdev.randint(0, 10 ** 3) for _ in range(1000)]

t1 = Timer(lambda: find_duplicate_integers3(numberList))  # Mine
t2 = Timer(lambda: find_duplicate_integers1(numberList))  # Goodies's
print(t1.timeit(number=1000))  # => 0.42611347176268827
print(t2.timeit(number=1000))  # => 1.0357027557108174
编辑2:


正如donkopotamus所指出的,还有一种更好(更快)的方法:
collections.Counter

如果你想知道你的代码有什么问题,请看我对你的代码所做的以下更改

def find_duplicate_integers(arg):
    stats = {}
    res  = {}
    for i in arg:
        if i in stats:
            stats[i] += 1
            res[i] = stats[i]
        else:
            stats[i] = 1
    return res

print find_duplicate_integers([1, 1, 3, 2, 3, 1, 0])
首先,您甚至没有查看,因为您设置了只检查大于1的整数的条件

if i > 1
此条件不是必需的(根据我从您的要求中了解的情况)

接下来,我创建了一个不同的列表来存储那些值大于1的变量


我强调,这不是解决这个问题的最好办法。我只是想指出你的代码中有什么错误,它给了你所得到的结果

如果你想知道你的代码有什么问题,请看下面我对你的代码所做的更改

def find_duplicate_integers(arg):
    stats = {}
    res  = {}
    for i in arg:
        if i in stats:
            stats[i] += 1
            res[i] = stats[i]
        else:
            stats[i] = 1
    return res

print find_duplicate_integers([1, 1, 3, 2, 3, 1, 0])
首先,您甚至没有查看,因为您设置了只检查大于1的整数的条件

if i > 1
此条件不是必需的(根据我从您的要求中了解的情况)

接下来,我创建了一个不同的列表来存储那些值大于1的变量


我强调,这不是解决这个问题的最好办法。我只是想指出你的代码中有什么错误,它给了你所得到的结果

您可以在pythons标准库中轻松完成此操作

def find_duplicate_integers(arg):
    return {k: v for k, v in collections.Counter(arg).items() if v > 1}
然后


在pythons标准库中可以很容易地实现这一点

def find_duplicate_integers(arg):
    return {k: v for k, v in collections.Counter(arg).items() if v > 1}
然后



你想要的结果和你描述它的方式是矛盾的。看起来您想要返回计数大于1的重复整数的计数,而不是它们的值。为此,如果i>1,您需要删除
,并在for循环完成后处理生成的统计图。您对
i>1
的检查在这里没有意义,因为
i
是值;不是重复的计数。但我希望从计数中完全排除小于1的值。如果您说大于1,则表示排除1。如果您说不小于1,则表示包含1。澄清你的想法。是否要包括或排除1?代码说要排除它:
如果i>1
。这意味着
i
必须严格大于1才能计数。非常清楚。现在,关于2的条目,听起来你想把它排除在外,因为只有一个条目,对吗?如果是这样的话,那么你需要消除计数为1的条目(或者避免首先添加它们)。只需将每个元素添加到dict中,然后删除你不想要的键…就这么简单…你想要的结果和你描述它的方式是冲突的。看起来您想要返回计数大于1的重复整数的计数,而不是它们的值。为此,如果i>1,您需要删除
,并在for循环完成后处理生成的统计图。您对
i>1
的检查在这里没有意义,因为
i
是值;不是重复的计数。但我希望从计数中完全排除小于1的值。如果您说大于1,则表示排除1。如果您说不小于1,则表示包含1。澄清你的想法。是否要包括或排除1?代码说要排除它:
如果i>1
。这意味着
i
必须严格大于1才能计数。非常清楚。现在,关于2的条目,听起来你想把它排除在外,因为只有一个条目,对吗?如果是这样的话,那么你需要消除计数为1的条目(或者避免首先添加它们)。只需将每个元素添加到dict中,然后删除你不想要的键…就这么简单…你能解释一下列表理解中的冒号
i:
吗?这是一个字典理解。字典包含在字典中用冒号分隔的键值对。这里可以找到很好的解释:很好!你能解释一下列表理解中的冒号吗?这是一个字典理解。字典包含在字典中用冒号分隔的键值对。这里可以找到很好的解释:很好!发生的事情就会发生:)哇,时差比我想象的要大。。。但正如我所说,在我的第一篇文章中,我并不关心运行时。我想加快速度,找到了一个解决方案,请参阅我帖子中的编辑;)哇,时差比我想象的要大。。。但正如我所说,在我的第一篇文章中,我并不关心运行时。我想加快速度,找到了一个解决方案,请参阅我帖子中的编辑;)