Python中集合的不区分大小写比较

2022-01-25 00:00:00 python django compare

问题描述

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

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'])]

相关文章