Python 3.6-使用计数器在列表中不包含重复值
最初,代码将查看列表A,然后计算是否有重复5次的数字。如果出现5次,代码将附加列表A中的编号和相应的列表B值 然后,如果列表a中有3个数字出现,将应用另一个条件,并打印列表B中的值和相应值 输出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 = ['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什么都没有给我?注释不是用于扩展讨论或调试;这段对话已经结束。如果从本次讨论中收集到任何相关见解,则应将其编辑成答案。