Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 如何限制同一元素可以从列表中打印多少次?_Python_Function_For Loop - Fatal编程技术网

Python 如何限制同一元素可以从列表中打印多少次?

Python 如何限制同一元素可以从列表中打印多少次?,python,function,for-loop,Python,Function,For Loop,正在处理一个赋值问题,该问题要求生成一个python函数,该函数将元素的重复次数限制为n次。例如,给定列表: [1,1,1,3,3,2,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”,“鲍勃”],其中n=2 返回的列表将是: [1,1,3,3,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”] def移除(项目,n=1): i=项目 返回(列表(集合(i))) 我知道集合不允许重复。但我想控制一个元素可以重复多少次 一种可能的解决方案是使用Pyth

正在处理一个赋值问题,该问题要求生成一个python函数,该函数将元素的重复次数限制为
n次。例如,给定列表:

[1,1,1,3,3,2,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”,“鲍勃”],其中n=2

返回的列表将是:
[1,1,3,3,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”]

def移除(项目,n=1):
i=项目
返回(列表(集合(i)))

我知道
集合
不允许重复。但我想控制一个元素可以重复多少次

一种可能的解决方案是使用Python标准库中的
itertools.groupby
itertools.islice

lst = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,"jim","jim",6,6,"bob","bob","bob"]

from itertools import groupby, islice

def remove(items, n=2):
    new_lst = []
    for v, g in groupby(items):
        new_lst.extend(islice(g, 0, n))
    return new_lst

print(remove(lst, 2))
印刷品:

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob']
[1, 1, 2, 2, 3, 3]

编辑:

如果要删除列表中的重复项,可以对已看到的项使用
set()

lst = [1,1,2,2,3,3,1,2]

from itertools import groupby, islice

def remove(items, n=2):
    new_lst, seen = [], set()
    for v, g in groupby(items):
        if not v in seen:
            new_lst.extend(islice(g, 0, n))
            seen.add(v)
    return new_lst

print(remove(lst, 2))
印刷品:

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob']
[1, 1, 2, 2, 3, 3]

一种可能的解决方案是使用Python标准库中的
itertools.groupby
itertools.islice

lst = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5,"jim","jim",6,6,"bob","bob","bob"]

from itertools import groupby, islice

def remove(items, n=2):
    new_lst = []
    for v, g in groupby(items):
        new_lst.extend(islice(g, 0, n))
    return new_lst

print(remove(lst, 2))
印刷品:

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob']
[1, 1, 2, 2, 3, 3]

编辑:

如果要删除列表中的重复项,可以对已看到的项使用
set()

lst = [1,1,2,2,3,3,1,2]

from itertools import groupby, islice

def remove(items, n=2):
    new_lst, seen = [], set()
    for v, g in groupby(items):
        if not v in seen:
            new_lst.extend(islice(g, 0, n))
            seen.add(v)
    return new_lst

print(remove(lst, 2))
印刷品:

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob']
[1, 1, 2, 2, 3, 3]

我喜欢使用
groupby
的答案,但是如果您想要一个没有itertools的选项,您可以制作一个简单的生成器,它可以跟踪计数并只在限制范围内生成结果。比如:

l = [1,1,1,3,3,3,2,2,2,4,4,4,5,5,5,"jim","jim",6,6,"bob","bob","bob"]
n = 2

def removedupes(l, n):
    count = 0
    prev = None
    for c in l:
        if c == prev:
            count += 1
        else:
            count = 0
        if count < n:
            yield c
        prev = c

list(removedupes(l, n))
# [1, 1, 3, 3, 2, 2, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob', 9, 9]
l=[1,1,1,3,3,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”,“鲍勃”]
n=2
清除的def(l,n):
计数=0
prev=无
对于l中的c:
如果c==prev:
计数+=1
其他:
计数=0
如果计数
我喜欢使用
groupby
的答案,但是如果您想要一个没有itertools的选项,您可以制作一个简单的生成器,它可以跟踪计数,并且只生成限制范围内的结果。比如:

l = [1,1,1,3,3,3,2,2,2,4,4,4,5,5,5,"jim","jim",6,6,"bob","bob","bob"]
n = 2

def removedupes(l, n):
    count = 0
    prev = None
    for c in l:
        if c == prev:
            count += 1
        else:
            count = 0
        if count < n:
            yield c
        prev = c

list(removedupes(l, n))
# [1, 1, 3, 3, 2, 2, 4, 4, 5, 5, 'jim', 'jim', 6, 6, 'bob', 'bob', 9, 9]
l=[1,1,1,3,3,2,2,4,4,5,5,“吉姆”,“吉姆”,6,6,“鲍勃”,“鲍勃”,“鲍勃”]
n=2
清除的def(l,n):
计数=0
prev=无
对于l中的c:
如果c==prev:
计数+=1
其他:
计数=0
如果计数
扩展注释:可以建立已遇到元素的统计信息,并且仅当元素到目前为止出现次数少于n次时,才将其附加到筛选列表中:

def remove(items, n = 1):
  stats={}
  filtered=[]
  for item in items:
    if item not in stats:
      stats[item]=0
    if stats[item]<n:
      filtered.append(item)
    stats[item]+=1
  return filtered

orig=[1,2,1,1,3,2,3,3,2,4,4,4,5,5,5,"jim",6,"jim",6,"bob",6,"bob","bob","bob"]
print(remove(orig))
print(remove(orig,2))
然后,你可以做一些疯狂的事情,比如用
functools.reduce()
替换循环,以及使用Python的三元表达式:

import functools
def fun(acc,item):
  acc[1][item]=1 if item not in acc[1] else acc[1][item]+1
  if acc[1][item]<=acc[2]:
    acc[0].append(item)
  return acc
remove=lambda items,n=1:functools.reduce(fun,items,([],{},n))[0]
然后把整件事包装成一行:

remove=lambda items,n=1:functools.reduce(
         lambda acc,item:(
           acc[1].update({item:1 if item not in acc[1] else acc[1][item]+1}),
           acc[0].append(item) if acc[1][item]<=acc[2] else None,
           acc
         )[2],
       items,([],{},n))[0]
remove=lambda项,n=1:functools.reduce(
lambda acc,项目:(
acc[1]。更新({项目:1,如果项目不在acc[1]中,则为acc[1][项目]+1}),

acc[0]。如果acc[1][item]扩展注释,则追加(item):可以建立已遇到元素的统计信息,并且仅当元素到目前为止出现次数少于n次时,才将其追加到筛选列表中:

def remove(items, n = 1):
  stats={}
  filtered=[]
  for item in items:
    if item not in stats:
      stats[item]=0
    if stats[item]<n:
      filtered.append(item)
    stats[item]+=1
  return filtered

orig=[1,2,1,1,3,2,3,3,2,4,4,4,5,5,5,"jim",6,"jim",6,"bob",6,"bob","bob","bob"]
print(remove(orig))
print(remove(orig,2))
然后,你可以做一些疯狂的事情,比如用
functools.reduce()
替换循环,以及使用Python的三元表达式:

import functools
def fun(acc,item):
  acc[1][item]=1 if item not in acc[1] else acc[1][item]+1
  if acc[1][item]<=acc[2]:
    acc[0].append(item)
  return acc
remove=lambda items,n=1:functools.reduce(fun,items,([],{},n))[0]
然后把整件事包装成一行:

remove=lambda items,n=1:functools.reduce(
         lambda acc,item:(
           acc[1].update({item:1 if item not in acc[1] else acc[1][item]+1}),
           acc[0].append(item) if acc[1][item]<=acc[2] else None,
           acc
         )[2],
       items,([],{},n))[0]
remove=lambda项,n=1:functools.reduce(
lambda acc,项目:(
acc[1]。更新({项目:1,如果项目不在acc[1]中,则为acc[1][项目]+1}),

acc[0]。如果acc[1][item],则追加(item)如您所见:set允许一个元素只出现一次。如果您想要更多,您需要一些东西来计算它们,比如保持元素计数器对。这可能是一个dict。如您所见:set允许一个元素只出现一次。如果您想要更多,您需要一些东西来计算它们,比如保持元素计数器对。这可能是一个dict.S我想补充的是,我在问题中忘记了如何让函数遍历整个列表,而不是它旁边的数字。例如,如果给出了一个类似于[1,1,2,2,3,3,1,2]的列表,并且n=1,[1,2,3,1,2]将返回,其中显然仍有重复项。不过感谢您的回复。我想补充一点,但我在问题中忘记了,那就是如何使函数遍历整个列表,而不是它旁边的数字。例如,如果给出了类似[1,1,2,2,3,3,1,2]的列表,并且n=1,[1,2,3,1,2]将返回,其中显然仍有重复项。不过感谢您的回复。我想补充一点,但我在问题中忘记了,那就是如何使函数遍历整个列表,而不是它旁边的数字。例如,如果给出了类似[1,1,2,2,3,3,1,2]的列表,并且n=1,[1,2,3,1,2]将返回,其中显然仍有重复项。不过感谢您的回复。我想补充一点,但我在问题中忘记了,那就是如何使函数遍历整个列表,而不是它旁边的数字。例如,如果给出了类似[1,1,2,2,3,3,1,2]的列表,并且n=1,[1,2,3,1,2]将被退回,其中显然仍有副本。谢谢您的回复。