在python中提取列表中的重复元素

时间:2016-01-20 20:39:40

标签: python list list-comprehension

我有一个列表理解问题,如果有人可以解决,我会感激不尽。问题是这样的:

我有一个元素列表:listX和listY

listX = [1,7,7,4,5,7,7]

listY = [2,4,4,3,1,4,6]

我想提取listX和listY的重复元素,但我需要确保(1)listX和listY中每个重复元素只有 3对,并且(2)两个列表的重复元素的索引相同。这意味着在listX中重复的元素是' 7'对于listY,重复的元素是' 4'并且它们都共享1,2,5的相同索引 - 尽管重复元素出现在listX的索引6中,但它不会在listY中显示为重复元素,因此它不会被计为重复对。

我想要提取重复的元素对,并且要删除重复元素来更新列表listX和listY。

所以最后的输出是

listX = [1,4,5,7]
listY = [2,3,1,6]

提取值

x=7
y=4

分别来自listX和listY

1 个答案:

答案 0 :(得分:4)

首先,使用zip和字典计算每对出现的频率:

listX = [1,7,7,4,5,7,7]
listY = [2,4,4,3,1,4,6]

pairs = {}
for (x, y) in zip(listX, listY):
    pairs[(x,y)] = pairs.get((x,y), 0) + 1

或者,正如评论中所建议的,使用collections.Counter

pairs = collections.Counter(zip(listX, listY))

现在,pairs将为{(1, 2): 1, (7, 4): 3, (7, 6): 1, (4, 3): 1, (5, 1): 1}。您还可以使用该字典来检查有多少重复对,以防您需要它,以及哪些对最常重复或重复一定次数。 然后,再次使用zip过滤那些具有正确计数并将它们分发回列表的对:

listX, listY = zip(*[p for p in zip(listX, listY) if pairs[p] != 3])

现在,listXlistY(1, 4, 5, 7)(2, 3, 1, 6)(这些是元组,但您可以轻松地将这些转换为列表)。

要获得重复的对,你可以这样做:

pair = pairs.most_common(1) # when using collections.Counter
pair = [p for p, c in pairs.items() if c == 3] # otherwise