Python中的集合不区分大小写的比较 [英] Case-insensitive comparison of sets in Python

查看:437
本文介绍了Python中的集合不区分大小写的比较的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两套(虽然我可以做列表,或其他):

I have two sets (although I can do lists, or whatever):

a = frozenset(('Today','I','am','fine'))
b = frozenset(('hello','how','are','you','today'))

我想得到:

frozenset(['Today'])

或至少:

frozenset(['today'])

第二个选项是可行的,如果我低估我推测的一切,但我正在寻找一个更优雅的方式。是否可以执行

The second option is doable if I lowercase everything I presume, but I'm looking for a more elegant way. Is it possible to do

a.intersection(b) 

以不区分大小写的方式?

in a case-insensitive manner?

Django中的快捷键也很好,因为我正在使用该框架。

Shortcuts in Django are also fine since I'm using that framework.

下面的交点方法示例(我无法弄清楚如何在评论中获得此格式):

Example from intersection method below (I couldn't figure out how to get this formatted in a comment):

print intersection('Today I am fine tomorrow'.split(),
                    'Hello How a re you TODAY and today and Today and Tomorrow'.split(),
                    key=str.lower)

[(['tomorrow'], ['Tomorrow']), (['Today'], ['TODAY', 'today', 'Today'])]


推荐答案

这是适用于任何对的版本的迭代:

Here's version that works for any pair of iterables:

def intersection(iterableA, iterableB, key=lambda x: x):
    """Return the intersection of two iterables with respect to `key` function.

    """
    def unify(iterable):
        d = {}
        for item in iterable:
            d.setdefault(key(item), []).append(item)
        return d

    A, B = unify(iterableA), unify(iterableB)

    return [(A[k], B[k]) for k in A if k in B]

示例:

print intersection('Today I am fine'.split(),
                   'Hello How a re you TODAY'.split(),
                   key=str.lower)
# -> [(['Today'], ['TODAY'])]

这篇关于Python中的集合不区分大小写的比较的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆