我有一个列表理解问题,如果有人可以解决,我会感激不尽。问题是这样的:
我有一个元素列表: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
答案 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])
现在,listX
和listY
为(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