我有一个列表理解问题,如果有人能解决我将不胜感激。问题是这样的:
我有一个元素列表: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
最佳答案
首先,使用 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))
现在,对
将是 {(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
关于python - 在python中提取列表中的重复元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34910053/