Python中的列表合并算法
我现在在做一个列表合并的算法,具体要求是这样的:如果在列表L1中的某个元素出现的次数比在列表L2中出现的次数多,那么合并后的结果应该返回这个元素在L1中出现的最大次数。如果某个元素在L2中出现的次数比在L1中多,那么就反过来处理。假如L1和L2没有共同的元素,那合并的结果就直接是两个列表的普通合并。到目前为止,我的思路是这样的:
- 遍历L1。
- 检查L1中的每个元素是否也在L2中。
- 如果L1中的某个元素也在L2中,比较一下这个元素在两个列表中出现的次数,看看哪个列表的次数更多。
- 如果L1和L2没有共同元素,就返回普通的集合合并结果。
- 把L1和L2的角色调换,重复第3步。
- 最后返回合并的结果。
我在考虑用max
函数来告诉Python,返回合并后列表中每个元素的出现次数应该是它在L1和L2中出现次数的最大值。你觉得怎么样?
4 个回答
1
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)]
当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。
1
你可以简单地使用字典,字典里的值可以是计数。合并的逻辑是:
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)]
4
这个任务非常适合使用 collections
这个标准模块,因为它提供了多重集合(multiset)的功能:
from collections import Counter
result_list = list((Counter(list1)|Counter(list2)).elements())
这里的 Counter
对象就代表了一个多重集合(也就是元素可以有多个副本的集合)。使用 |
这个运算符可以得到每个元素的最大数量,而 elements()
方法会返回一个迭代器,里面的每个元素会根据它的数量被返回相应的次数。
如果你不需要一个列表,而是可以在代码中使用多重集合,那么 Counter(list1) | Counter(list2)
就是你需要的集合合并操作 多重集合。