Python程序查找数组中重复相邻元素的计数

新手上路,请多包涵

我想编写一个 python 程序,它必须计算数组中相邻位置的重复元素。我想显示出现次数。

 # Example
alist=[1,2,2,3,3,5,6]  # ----- output - 4
alist=[1,2,3,4] # -------------output - 0
alist=[4,5,6,6,8,8,8,8] # -------output - 8

我试过了

alist=[1,20,4,4,4,50];
i =0;
nextele=0;
temp=0;

while(i < len(alist)):
  'print(alist[i])'
   temp = alist[i];
   nextele =alist[i+1];\\here i am getting error out of bound when it iterates last elelment
  i=i+1;

提前致谢 - -

原文由 Karthick Anbazhagan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 533
2 个回答

因为你有 alist[i+1] 在 for 循环中,你不能通过列表直到结束,所以你必须在结束之前结束它的一个元素:

 for i in range(len(alist)-1):
    if(alist[i] == alist[i+1]):
        counter+=2    # since you count both elements

alist=[1,2,2,3,3,5,6] # 4
alist=[4,5,6,6,8,8,8,8] # 8

原文由 ᴀʀᴍᴀɴ 发布,翻译遵循 CC BY-SA 3.0 许可协议

An efficient way to do this is to use sum with a generator expression that alist with alist[1:] so we can compare adjacent items of alist

 data = [
    [1, 2, 2, 3, 3, 5, 6],
    [1, 2, 3, 4],
    [4, 5, 6, 6, 8, 8, 8, 8],
    [1, 20, 4, 4, 4, 50],
]

for alist in data:
    a = sum(2 for u, v in zip(alist, alist[1:]) if u == v)
    print(alist, a)

输出

[1, 2, 2, 3, 3, 5, 6] 4
[1, 2, 3, 4] 0
[4, 5, 6, 6, 8, 8, 8, 8] 8
[1, 20, 4, 4, 4, 50] 4

如果你真的想要重复项目的总数,你可以使用列表理解(或生成器表达式) itertools.groupby 来找到重复的组,然后另一个生成器表达式来总结包含超过1个元素。

 from itertools import groupby

data = [
    [1, 2, 2, 3, 3, 5, 6],
    [1, 2, 3, 4],
    [4, 5, 6, 6, 8, 8, 8, 8],
    [1, 20, 4, 4, 4, 50],
]

for alist in data:
    runs = [len(list(g)) for _, g in groupby(alist)]
    repeats = sum(u for u in runs if u > 1)
    print(alist, repeats)

输出

[1, 2, 2, 3, 3, 5, 6] 4
[1, 2, 3, 4] 0
[4, 5, 6, 6, 8, 8, 8, 8] 6
[1, 20, 4, 4, 4, 50] 3

该列表理解可以与生成器表达式结合使用:

 for alist in data:
    repeats = sum(u for u in (len(list(g)) for _, g in groupby(alist)) if u > 1)
    print(alist, repeats)

原文由 PM 2Ring 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题