Python中的列表联合算法

Python中的列表联合算法,python,algorithm,Python,Algorithm,我现在正在尝试使用列表联合算法,并遵循以下规范:如果L1中的元素在L1中出现的次数多于在L2中出现的次数,则联合应返回最大出现次数,即它在L1中出现的次数,如果元素在L2中出现的次数多于在L1中出现的次数,则L1和L2的角色将切换。如果L1和L2不相交,则并集只返回正则集并集。到目前为止,我的思考过程是: 遍历L1 检查L1中的任何元素是否也在L2中 如果L1中的某个元素也在L2中,请检查哪个列表具有该元素的较大计数 如果L1和L2不相交,则返回正则集并集 重复步骤3,使L2和L1反向 返回工会

我现在正在尝试使用列表联合算法,并遵循以下规范:如果L1中的元素在L1中出现的次数多于在L2中出现的次数,则联合应返回最大出现次数,即它在L1中出现的次数,如果元素在L2中出现的次数多于在L1中出现的次数,则L1和L2的角色将切换。如果L1和L2不相交,则并集只返回正则集并集。到目前为止,我的思考过程是:

  • 遍历L1
  • 检查L1中的任何元素是否也在L2中
  • 如果L1中的某个元素也在L2中,请检查哪个列表具有该元素的较大计数
  • 如果L1和L2不相交,则返回正则集并集
  • 重复步骤3,使L2和L1反向
  • 返回工会

  • 我在考虑使用
    max
    函数来告诉Python返回列表,其中union中每个元素的多重性是元素在L1和L2中的最大出现次数。创意?

    这是
    收藏
    标准模块的完美工作,该模块提供多集:

    from collections import Counter
    
    counts = Counter(L1)
    for value, count in Counter(L2).items()
        counts[value] = max(counts[value], count)
    newlist = [value for value, count in counts.items() for _ in range(count)]
    
    from collections import Counter
    
    result_list = list((Counter(list1)|Counter(list2)).elements())
    
    计数器
    对象在这里表示一个多集(通常包含其元素的一个以上副本),联合运算符
    |
    保留每个元素的最大计数,并且
    elements()
    返回一个迭代器,其中每个元素返回与其计数对应的次数


    如果您确实不需要列表,但可以在代码中使用多集,则
    计数器(列表1)|计数器(列表2)
    是您需要的联合。

    这是
    集合
    标准模块的完美工作,该模块提供多集:

    from collections import Counter
    
    result_list = list((Counter(list1)|Counter(list2)).elements())
    
    计数器
    对象在这里表示一个多集(通常包含其元素的一个以上副本),联合运算符
    |
    保留每个元素的最大计数,并且
    elements()
    返回一个迭代器,其中每个元素返回与其计数对应的次数


    如果您确实不需要列表,但可以在代码中使用多集,那么
    计数器(列表1)|计数器(列表2)
    就是您所需要的并集。

    您可能只需要使用计数作为值的dict。联合逻辑是:

    counts = {i: max(L1.get(i,0), L2.get(i,0)) for i in set(L1)|set(L2) }
    
    最后的名单是

    newlist = [value for value, count in counts.items() for _ in range(count)]
    

    您可能只需要使用计数作为值的dict。联合逻辑是:

    counts = {i: max(L1.get(i,0), L2.get(i,0)) for i in set(L1)|set(L2) }
    
    最后的名单是

    newlist = [value for value, count in counts.items() for _ in range(count)]
    

    可以使用仅使用列表及其最大/最小属性的解决方案

    union = [] 
    [union.extend([n] * max(l1.count(n), l2.count(n))) for n in range (min(min(l1),min(l2)), max(max(l1),max(l2))+1)]
    

    可以使用仅使用列表及其最大/最小属性的解决方案

    union = [] 
    [union.extend([n] * max(l1.count(n), l2.count(n))) for n in range (min(min(l1),min(l2)), max(max(l1),max(l2))+1)]
    


    请发布您当前的实现。这似乎是
    集合。计数器
    …我知道
    集合。计数器
    的实现。把它转换成字典会使这更容易。好主意。请将您的测试用例与预期输出一起发布。您需要知道Python如何有效地解决此问题,还是只需要使用基本工具(家庭作业等)编写算法?请发布您当前的实现。似乎是
    集合。计数器的工作
    …我知道
    集合。计数器
    的实现。把它转换成字典会使这更容易。好主意。请将您的测试用例与预期输出一起发布。您需要知道Python如何有效地解决此问题,还是只需要使用基本工具(家庭作业等)编写算法?酷。这比我的回答好多了。这比我的回答要好得多。我简化了键并集的计算。这是一种很好的“手动”方式,可以获得与dict(计数器(L1)|计数器(L2))相同的内容。(使用集合导入计数器的
    )。然而,
    计数器
    类及其并集运算符就是为了实现这一点,其优点是代码更加明确。我还添加了结果列表的构造,因为这是问题所要求的。我简化了键并集的计算。这是一种很好的“手动”方式,可以获得与dict(计数器(L1)|计数器(L2))相同的内容。
    (使用集合导入计数器的
    )。但是,
    计数器
    类及其union运算符就是为了实现这一点,其优点是代码更加明确。我还添加了结果列表的构造,因为这是问题所要求的。这可能非常低效,因为此解决方案会遍历所有可能的值(
    l1=[0]
    l2=[2**1000]
    );另外,
    count()
    要求为每个可能的值遍历每个列表,这也需要相对较长的时间。这个解决方案还假设列表中的元素是整数:这是不必要的限制。基于字典或计数器的解决方案速度更快,更通用。这可能是非常低效的,因为此解决方案会遍历所有可能的值(
    l1=[0]
    l2=[2**1000]
    );另外,
    count()
    要求为每个可能的值遍历每个列表,这也需要相对较长的时间。这个解决方案还假设列表中的元素是整数:这是不必要的限制。基于字典或计数器的解决方案速度更快、更通用。
    [value for value,count in counts.items()for u in range(count)]
    也可以是
    sum([value]*count for value,count in count.items(),[])
    :它的优点是更直接地显示最终列表的结构(重复值).@EOL,sum仅对数值类型有效。对于列表,它具有二次性能(O(n**2))<使用
    .elements()
    列出
    可能是我同意的最好方法:使用
    sum()
    只对其易读性有一点好处。:)您的列表理解具有线性性能,这是更好的方式。
    [值对值,计数在计数中。items()用于范围内(计数)]