Python 3.6-使用计数器在列表中不包含重复值

Python 3.6-使用计数器在列表中不包含重复值,python,list,count,duplicates,conditional-statements,Python,List,Count,Duplicates,Conditional Statements,最初,代码将查看列表A,然后计算是否有重复5次的数字。如果出现5次,代码将附加列表A中的编号和相应的列表B值 然后,如果列表a中有3个数字出现,将应用另一个条件,并打印列表B中的值和相应值 输出 a = ['1','1','1','1','1','3','3','3','1','1','1','1','1'] b = ['4','8','3','1','7','6','4','9','8','3','2','5','2'] from collections import Counter cou

最初,代码将查看列表A,然后计算是否有重复5次的数字。如果出现5次,代码将附加列表A中的编号和相应的列表B值

然后,如果列表a中有3个数字出现,将应用另一个条件,并打印列表B中的值和相应值

输出

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2']

from collections import Counter
counts = Counter(a)

c = []
d = []

for x, y in zip(a, b):
    if counts[x] == 5:
        c.append(x)
        d.append(y)
    if not counts[x] == 5:
       if counts[x] == 3:
           c.append(x)
           d.append(y)
    else:
        None
# c = ['3','3','3']
然而,在我的示例中,我相信如果以后重复,在搜索这5个事件时会感到困惑

所需输出

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2']

from collections import Counter
counts = Counter(a)

c = []
d = []

for x, y in zip(a, b):
    if counts[x] == 5:
        c.append(x)
        d.append(y)
    if not counts[x] == 5:
       if counts[x] == 3:
           c.append(x)
           d.append(y)
    else:
        None
# c = ['3','3','3']
我怎样才能让它指定一个实例中必须正好有5个实例



根据评论,这里有一个可能的解决方案。也许可以使用
itertools.groupby
或其他技巧来缩短它

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2']

counter, c, d = 1, [], []

a[-1] = ['-1']
b[-1] = ['-1']

for i,j in enumerate(a):
    if a[i-1]==a[i]:
        counter+=1

        if counter == 5 and a[i+1]!=a[i]:
            c += [j]*5
            d += b[i-4:i+1]
            counter = 1

        if counter == 3:
            c += [j]*3
            d += b[i-2:i+1]
            counter = 1   
    else:
        pass
def find_group(l,group_len):
i=0
而我
我想你可以用一个简单的计数器,比如:

def find_group(l, group_len):
    i = 0
    while i < len(l):
        j = i + 1
        while j < len(l) and l[i] == l[j]:
            j += 1
            if j - i == group_len:
                return i
            i = j
    return None

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2']
start3 = find_group(a, 3)
start5 = find_group(a, 5)
c = []
d = []
if start5 is not None:
    c += a[start5:start5 + 5]
    d += b[start5:start5 + 5]

if start3 is not None:
    c += a[start3:start3 + 3]
    d += b[start3:start3 + 3]

print(c)
print(d)
这将产生以下结果:

#!/usr/bin/env python

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2']

counter, c, d = 1, [], []

# append non existing values in a,b such that not to count the 
# last consecutive series - in this case the '1's
# if you want to count the last 5 '1's then you can change the
# following lines to:
# a += ['-1'] and b += ['-1']

a[-1] = ['-1']
b[-1] = ['-1']

for i,j in enumerate(a):
    if a[i-1]==a[i]:
        counter+=1

        if counter == 3 and a[i+1]!=a[i]:
            c += [j]*3
            d += b[i-2:i+1]
            counter = 1

        elif counter == 5:
            c += [j]*5
            d += b[i-4:i+1]
            counter = 1   
    else:
        pass

print 'c list: {}'.format(c)
print 'd list: {}'.format(d)
更新

如果希望c列表不包含重复值,请将上述代码更改为:

c list: ['1', '1', '1', '1', '1', '3', '3', '3']
d list: ['4', '8', '3', '1', '7', '6', '4', '9']
结果:

#!/usr/bin/env python

a = ['1','1','1','1','1','3','3','3','1','1','1','1','1','4','4','4','2']
b = ['4','8','3','1','7','6','4','9','8','3','2','5','2','1','2','3','1']

counter, c, d = 1, [], []

a[-1] = ['-1']
b[-1] = ['-1']

for i,j in enumerate(a):
    if a[i-1]==a[i] and a[i] not in c:
        counter+=1

        if counter == 3 and a[i+1]!=a[i]:
            c += [j]*3
            d += b[i-2:i+1]
            counter = 1

        elif counter == 5:
            c += [j]*5
            d += b[i-4:i+1]
            counter = 1   
    else:
        pass

print 'c list: {}'.format(c)
print 'd list: {}'.format(d)

请记住,通过这种方式,您的代码会进行更多的检查,以查看该项是否在c-list上,因此比以前贵了一点。

您说过要过滤掉,但随后您要添加。@MosesKoledoye现在重新编写了它。请注意,
计数器会重复10次而不是5次。你是在要求连续重复吗?@MosesKoledoye是的,这是我的问题,第一次应该算5次,但我希望它忽略第二次instance@MosesKoledoye如果有两次发生5次,则只计算第一次。谢谢您的回复,然而,当我使用代码时,它似乎对c和d什么都没有给我?注释不是用于扩展讨论或调试;这段对话已经结束。如果从本次讨论中收集到任何相关见解,则应将其编辑成答案。