【问题标题】:Python list identifying duplicat pairs [closed]识别重复对的Python列表[关闭]
【发布时间】:2023-11-15 04:46:01
【问题描述】:

我有一个如下列表 [3, 5, 6, 8, 1, 5, 3, 9, 0, 8, 6] 我想找出一个列表中有多少对正向和反向迭代 我想要如下语句的输出 2 对:(3,5) 和 (6,8) 有机会请帮忙 我已经尝试过类似下面的方法,但它是错误的,所以请帮忙!

list2=[3, 5, 6, 8, 1, 5, 3, 9, 0, 8, 6]
list3=[]
for x in list2:
    if list2.count(x)>1:
        list3.append(x)
print ('dups is ',list3)

谢谢

【问题讨论】:

  • 劳拉你好。你到底有什么问题?你知道如何成对迭代吗?您是否难以将其应用于向后迭代?跟踪这些对如何?
  • 问题不清楚。你能解释一下正向和反向的配对吗?你也想计算重复对吗?
  • 你能展示你尝试过的东西吗?在这里提问之前,请自己努力解决问题。
  • 嗨 juanpa.arrivillaga 在列表中,如果我们向前遍历,则重复 3 和 5,同时向后遍历 6 和 8,这就是打印所需的内容。这可能是一件容易的事情,但由于我是 python 新手,遇到了一些麻烦
  • @Lara - 一种方法是为数字和索引构建字典/哈希图,然后找到所有距离为 1 的数字 - 如果这些数字出现两次,则将它们分组。

标签: python list traversal forward


【解决方案1】:

您可以使用集合中的 Counter 并为其提供元素按升序排列的元组(忽略实际顺序):

L = [3, 5, 6, 8, 1, 5, 3, 9, 0, 8, 6]

from collections import Counter

D = [pair for pair,count in
     Counter(map(tuple,map(sorted,zip(L,L[1:])))).items() 
     if count > 1]

print(D) # [(3, 5), (6, 8)]

它是如何工作的:

  • zip(L,L[1:]) 将每个元素与其后继元素配对

    (3, 5), (5, 6), (6, 8), (8, 1), (1, 5), (5, 3), (3, 9), (9, 0) , (0, 8), (8, 6)

    但里面的 (3,5) 和 (5,3) 不一样

  • map(sorted,...) 对这些对中的每一对进行排序

    [3, 5], [5, 6], [6, 8], [1, 8], [1, 5], [3, 5], [3, 9], [0, 9] , [0, 8], [6, 8]

    现在 (5,3) 和 (3,5) 都变为 [3,5] 并且我们有两个匹配的 [3,5] 但这些是不可散列的小列表,因此无法被 Counter 计数。

  • map(tuple,...) 将列表转回元组(可散列)

    (3, 5), (5, 6), (6, 8), (1, 8), (1, 5), (3, 5), (3, 9), (0, 9) , (0, 8), (6, 8)

  • Counter(...) 计算每对的计数(有序元组)

  • 剩下的是一个列表推导,它遍历 Counter 字典的项目并选择计数大于 1 的键(对)。

【讨论】:

  • 感谢阿兰的回复