📜  如何遍历多重映射中给定键的所有值?(1)

📅  最后修改于: 2023-12-03 15:24:57.050000             🧑  作者: Mango

如何遍历多重映射中给定键的所有值?

在使用多重映射容器时,我们有时需要遍历给定键的所有值。在这篇文章中,我们将介绍如何在C++和Python中实现这个操作。

C++
1. unordered_multimap

unordered_multimap是C++11标准中引入的一种关联容器,支持在O(1)时间内查找,插入和删除元素。下面是利用unordered_multimap遍历给定键的所有值的代码示例:

#include <unordered_map>
#include <iostream>

using namespace std;

int main() {
  unordered_multimap<int, string> umm;

  // 插入元素
  umm.insert({1, "apple"});
  umm.insert({2, "banana"});
  umm.insert({1, "orange"});
  umm.insert({3, "peach"});
  umm.insert({1, "pear"});
  
  // 遍历指定键值对应的所有元素
  auto range = umm.equal_range(1);
  for (auto it = range.first; it != range.second; ++it) {
    cout << it->second << endl;
  }

  return 0;
}

输出结果为:

apple
orange
pear
2. multimap

multimap是C++标准STL中的一种关联容器,它也支持在O(logN)时间内查找,插入和删除元素。我们可以通过multimap的成员函数equal_range()iterator来访问指定键对应的所有元素。下面是利用multimap遍历给定键的所有值的代码示例:

#include <map>
#include <iostream>

using namespace std;

int main() {
  multimap<int, string> mm;
  
  // 插入元素
  mm.insert({1, "apple"});
  mm.insert({2, "banana"});
  mm.insert({1, "orange"});
  mm.insert({3, "peach"});
  mm.insert({1, "pear"});
  
  // 遍历指定键值对应的所有元素
  auto range = mm.equal_range(1);
  for (auto it = range.first; it != range.second; ++it) {
    cout << it->second << endl;
  }

  return 0;
}

输出结果同样为:

apple
orange
pear
Python

在Python中,我们可以使用列表推导式或filter()函数来实现遍历给定键的所有值。

1. collections 模块

collections模块中的defaultdictmultidict实现了多重映射容器的功能。我们可以使用collections模块中的defaultdict来实现遍历给定键的所有值。下面是使用defaultdict实现遍历给定键的所有值的代码示例:

from collections import defaultdict

d = defaultdict(list)
d[1].append('apple')
d[2].append('banana')
d[1].append('orange')
d[3].append('peach')
d[1].append('pear')

# 遍历指定键值对应的所有元素
for v in d[1]:
  print(v)

输出结果为:

apple
orange
pear
2. 字典推导式和 filter() 函数

我们也可以使用列表推导式或filter()函数来实现遍历给定键的所有值。下面是使用字典推导式和 filter() 函数实现遍历给定键的所有值的代码示例:

data = {1: ['apple', 'orange', 'pear'], 2: ['banana'], 3: ['peach']}
key = 1

# 列表推导式
vals = [v for k, vs in data.items() if k == key for v in vs]
print(vals)

# filter() 函数
vals = list(filter(lambda v: key in data and v in data[key], data.values()))
print(vals)

输出结果同样为:

['apple', 'orange', 'pear']