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:
吗?这是一个字典理解。字典包含在字典中用冒号分隔的键值对。这里可以找到很好的解释:很好!你能解释一下列表理解中的冒号吗?这是一个字典理解。字典包含在字典中用冒号分隔的键值对。这里可以找到很好的解释:很好!发生的事情就会发生:)哇,时差比我想象的要大。。。但正如我所说,在我的第一篇文章中,我并不关心运行时。我想加快速度,找到了一个解决方案,请参阅我帖子中的编辑;)哇,时差比我想象的要大。。。但正如我所说,在我的第一篇文章中,我并不关心运行时。我想加快速度,找到了一个解决方案,请参阅我帖子中的编辑;)