Python - 从另一个中减去一个字典列表

标签 python list dictionary

我有兴趣比较多个列表,找出差异并迭代。

两者都是包含以下键的字典列表: 'ssid' - str,'bssid' - str,'channel' - int,'flags' - list,'found' - bool

我试过:

 list = list(set(networks_list).difference(missing_networks))

但我收到错误:

unhashable type 'dict'

我的数据结构是这样的:

list: [{'found': False, 'flags': ['WPA2-PSK-CCMP', 'WPS', 'ESS'], 'ssid': 'SOHO_BROADCAST', 'bssid': '30:46:9a:9d:11:1a', 'channel': 1}, {'found': False, 'flags': ['WPA-EAP-TKIP', 'WPA2-EAP-CCMP', 'ESS'], 'ssid': 'Cisco 2.4ghz', 'bssid': '40:f4:ec:7f:3c:5a', 'channel': 11}, {'found': False, 'flags': ['WPA-EAP-TKIP', 'WPA2-EAP-CCMP', 'ESS'], 'ssid': 'Cisco 5.0ghz', 'bssid': '40:f4:ec:7f:3c:54', 'channel': 149}]

缺失的网络最初是空的。

有没有一种简单的方法可以做到这一点?

最佳答案

像这样的通用方法可能有很多缺陷,但如果您的字典主要是原始的,而且不是很大,您可以这样做:

假设您的数据如下所示:

networks = [
        {'address': '192.168.1.1'},
        {'address': '127.0.0.1'},
    ]

missing = [
        {'address': '127.0.0.1'}
    ]

您可以将字典列表转换为列表元组(可哈希)

def make_hashable(d):
    return (frozenset(x.iteritems()) for x in d)

networks_hashable = make_hashable(networks)
missing_hashable = make_hashable(missing)

然后减去

diff = set(networks_hashable).difference(missing_hashable)

现在你有一个元组列表

print list(diff)

或者,转换回字典

print [dict(x) for x in diff]

更新

我根据@gnibbler 的评论更改了make_hashable 的定义。

关于Python - 从另一个中减去一个字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12100731/

相关文章:

c++ - 如何使用 std::map 获取双向迭代器的索引?

Python 性能——你是否曾经不得不用其他东西重写?

python - 根据形状对 numpy 数组列表进行分组。 Pandas ?

java - 创建变量中定义的类的 ArrayList

Python-如何对文件中的值求和

Python3 - 将字符串转换为字典

python - Pandas:将所有 re.search 结果从 BeautifulSoup 写入 csv

python - 基于输入类型的Django查询集

python - 错误: 'list' object has no attribute 'lower'

c# - 使现有的字典不区分大小写 .Net