Python 筛选元组数据列表

Python 筛选元组数据列表,python,list,tuples,Python,List,Tuples,我有一个如下的清单 list1=[ (‘拉姆’、‘拉克斯曼’、‘巴拉特’、‘西塔’), ('Ram'、'Ravan'、'Bharat'、'Sita'), (‘Ram’、‘Luv’、‘Dashrat’、‘Sita’), ('Dasrath'、'Kekei'、'Bharat'、'Ram'), (‘拉克斯曼’、‘巴拉特’、‘拉姆’、‘哈努曼’), ('Hanuman'、'Sita'、'Kekei'、'Ravan'), ('Ram'、'Sita'、'Hanuman'、'Ravan') ] 我想过滤至少

我有一个如下的清单

list1=[
(‘拉姆’、‘拉克斯曼’、‘巴拉特’、‘西塔’),
('Ram'、'Ravan'、'Bharat'、'Sita'),
(‘Ram’、‘Luv’、‘Dashrat’、‘Sita’),
('Dasrath'、'Kekei'、'Bharat'、'Ram'),
(‘拉克斯曼’、‘巴拉特’、‘拉姆’、‘哈努曼’),
('Hanuman'、'Sita'、'Kekei'、'Ravan'),
('Ram'、'Sita'、'Hanuman'、'Ravan')
]
我想过滤至少有3个元组值匹配的列表数据,如果2个或更多元组至少有3个值匹配,那么列表中应该只有第一个元组和其余元组。 例如,在上面的列表中,我们有下面的列表元组,它有3个值匹配

结果=[
(‘拉姆’、‘拉克斯曼’、‘巴拉特’、‘西塔’),
(‘Ram’、‘Luv’、‘Dashrat’、‘Sita’),
('Dasrath'、'Kekei'、'Bharat'、'Ram'),
('Hanuman'、'Sita'、'Kekei'、'Ravan')
]
来自操作员导入添加
从functools导入reduce
def solve(xss):
mems=[xss[0]]
对于xss[1:]中的xs:
如果len(set(reduce(add,mems))。交点(set(xs)))<3:
mems=mems+[xs]
返回mems

我觉得你的问题很有趣。我用一些矩阵运算来解决它。我认为这种方式比普通循环快得多

from collections import OrderedDict
import numpy as np
from sklearn.preprocessing import MultiLabelBinarizer

class DuplicateFinder(object):
    def __init__(self, raw_list):
        self.raw_list = raw_list
        self.multi_label_encoder = MultiLabelBinarizer()
        self.final_results = OrderedDict()
        self.title_select = []
        self.content_select = []
        self.not_select = []

    @property
    def match_result(self):
        label_matrix = self.multi_label_encoder.fit_transform(self.raw_list)
        return np.dot(label_matrix, label_matrix.T)

    @property
    def raw_results(self):
        return np.array(np.where(self.match_result >= 3)).T

    def solve(self):
        for result in self.raw_results:
            if result[0] == result[1]:
                continue
            if result[0] in self.content_select:
                continue
            if result[0] not in self.final_results:
                self.final_results[result[0]] = []
                self.final_results[result[0]].append(result[1])
                self.title_select.append(result[0])
                self.content_select.append(result[1])
            elif result[1] not in self.content_select + self.title_select:
                self.final_results[result[0]].append(result[1])
                self.content_select.append(result[1])
            else:
                continue
        self.not_select = list(set(range(self.match_result.shape[0])) - set(
            self.title_select + self.content_select
        ))

    def print_result(self):
        print(f"This is more than one matched: {self.final_results}")
        for key in self.final_results:
            print(self.raw_list[key])
        print(f"This is just one: {self.not_select}")
        for key in self.not_select:
            print(self.raw_list[key])

list1 = [
    ("Ram", "Laxman", "Bharat", "Sita"),
    ("Ram", "Ravan", "Bharat", "Sita"),
    ("Ram", "Luv", "Dashrat", "Sita"),
    ("Dasrath", "Kekei", "Bharat", "Ram"),
    ("Laxman", "Bharat", "Ram", "Hanuman"),
    ("Hanuman", "Sita", "Kekei", "Ravan"),
    ("Ram", "Sita", "Hanuman", "Ravan"),
]
solver = DuplicateFinder(list1)
solver.solve()
solver.print_result()
结果是:

This is more than one matched: OrderedDict([(0, [1, 4]), (5, [6])])
('Ram', 'Laxman', 'Bharat', 'Sita')
('Hanuman', 'Sita', 'Kekei', 'Ravan')
This is just one: [2, 3]
('Ram', 'Luv', 'Dashrat', 'Sita')
('Dasrath', 'Kekei', 'Bharat', 'Ram')

这是一个问题-你尝试了什么?非常感谢@youngseok Jeon,我将测试此函数并更新。上面的答案只检查第一个元组的类似元组组合。非常感谢@Xu Qiushi,我将测试此函数并更新。我忘记了导入OrderedDict,我在第一行中修复了它。顺便说一下,按照我的方式,您应该安装
scikit-learn
numpy
firtst。使用以下命令
pip-install-scikit-learn-numpy
非常感谢@Xu-Qiushi,我已经测试了代码,它工作得非常好。非常感谢!!!!