Python:在相应的两个列表中查找最常见的元素

Python:在相应的两个列表中查找最常见的元素,python,list,Python,List,我有两个列表,包含点的x和y坐标,其中每个对应的元素代表一个点 举个例子,X_List=[1,3,1,4],Y_List=[6,7,6,1],那么点是(1,6)(3,7)(1,6)(4,1)。因此,最常见的点是(1,6) 这是我的密码: Points=[] for x,y in zip(X_List, Y_List): Points.append([x,y]) MostCommonPoint = max(set(Points), key=Points.count) 但是,这不能作为不可破坏类型

我有两个列表,包含点的x和y坐标,其中每个对应的元素代表一个点

举个例子,X_List=[1,3,1,4],Y_List=[6,7,6,1],那么点是(1,6)(3,7)(1,6)(4,1)。因此,最常见的点是(1,6)

这是我的密码:

Points=[]
for x,y in zip(X_List, Y_List):
Points.append([x,y])
MostCommonPoint = max(set(Points), key=Points.count)

但是,这不能作为不可破坏类型的列表中的点工作。

首先,
zip
返回元组列表(或Python 3中的元组迭代器)。这意味着您可以使用
zip(X\u列表,Y\u列表)
而不是
(或者在Python3上使用
List(zip(X\u列表,Y\u列表))
),您的代码就可以工作了。然而,这需要二次时间

更快的方法是使用A,这是一个dict子类,设计用于计算事物:

import collections

# Produce a Counter mapping each point to how many times it appears.
counts = collections.Counter(zip(X_List, Y_List))

# Find the point with the highest count.
MostCommonPoint = max(counts, key=counts.get)
使用计数器:

>>> from collections import Counter
这很简单: 一步一步地 构建点列表:

>>> x_lst = [1, 3, 1, 4]
>>> y_lst = [6, 7, 6, 1]
>>> pnts = zip(x_lst, y_lst)
>>> pnts
[(1, 6), (3, 7), (1, 6), (4, 1)]
创建一个
计数器
,该计数器能够计算所有项目:

>>> counter = Counter(pnts)
>>> counter
Counter({(1, 6): 2, (3, 7): 1, (4, 1): 1})
获取(一)个最常见项目的列表:

>>> counter.most_common(1)
[((1, 6), 2)]
获取项目本身:

>>> counter.most_common(1)[0][0]
(1, 6)

@扬·弗尔辛斯基是正确的人选。另一个似乎有效的简单方法如下。不过,我没有比较这些表演

答复:

要点:

博文:


您还可以使用counts.most_common(1)来获取(包含)最公共点的列表。这稍微简单一点,并在集合中保存了另一个迭代。(在这种情况下可能不会节省太多,但总的来说,很高兴知道。)@Weeble:
最常见的(1)
最终还是调用了
max
。使用
[0][0]
提取列表中的一个元素,然后提取元素计数元组的第一部分,我认为在代码的简单性方面是收支平衡的。啊,这很公平。我错误地认为计数器内容是按顺序维护的,但看起来大多数常用(n)使用heapq.nlargest遍历集合。同意一旦你考虑破坏结果,它就否定了简单性的好处。
>>> counter.most_common(1)[0][0]
(1, 6)
import itertools

a = [7, 3]
b = [3, 1, 2]
c = [4, 3, 5]


def allEqual(t):
    same = True

    if len(t) == 1:
        return True

    if len(t) == 0:
        return False

    for i in range(1, len(t)):
        if t[i] != t[i - 1]:
            same = False
            i = len(t) - 1
        else:
            same = same and True

    return same


combo = list(itertools.product(a, b, c))
# print list(itertools.permutations(a,2))
# print combo

# combo = [x for x in combo if x[0]==x[1]==x[2]]
# print combo

combo = [x for x in combo if allEqual(x)]
print combo