python 中的一组字符串元组

Set of string tuples in python

如何找到字符串的元组集?

例如有一个列表 [('a', 'b'), ('b', 'a'), ('c','d')]

对我来说 ('a', 'b')('b', 'a') 相同。里面有没有什么功能 python 哪个可以识别并删除其中的一个?

只需对元组进行排序:

unique = set(tuple(sorted(t)) for t in inputlist)

演示:

>>> inputlist = [('a', 'b'), ('b', 'a'), ('c','d')]
>>> set(tuple(sorted(t)) for t in inputlist)
set([('a', 'b'), ('c', 'd')])

您可以在 Python 中扩展 collections.MutableSet() (collections.abc.MutableSet 3) 以封装该行为:

try:
    # Python 3
    from collections.abc import MutableSet
except ImportError:
    # Python 2
    from collections import MutableSet

class SortingSet(MutableSet):
    def __init__(self, values):
        self._values = set()
        for v in values:
            self.add(v)

    def __repr__(self):
        return '<{}({}) at {:x}>'.format(
            type(self).__name__, list(self._values), id(self))

    def __contains__(self, value):
        return tuple(sorted(value)) in self._values

    def __iter__(self):
        return iter(self._values)

    def __len__(self):
        return len(self._values)

    def add(self, value):
        self._values.add(tuple(sorted(value)))

    def discard(self, value):
        self._values.discard(tuple(sorted(value)))

演示:

>>> inputlist = [('a', 'b'), ('b', 'a'), ('c','d')]
>>> sset = SortingSet(inputlist)
>>> sset
<SortingSet([('a', 'b'), ('c', 'd')]) at 106b74c50>
>>> ('d', 'c') in sset
True

怎么样:

list_ = [('a', 'b'), ('b', 'a'), ('c','d')]

set_ = set(frozenset(tuple) for tuple in list_)

print(set_)

?在 CPython 3.4 上测试。

到目前为止的答案根本不保持顺序,如果这对你很重要,那么使用这个:

>>> from collections import OrderedDict
>>> items = [('a', 'b'), ('b', 'a'), ('c','d')]
>>> OrderedDict((frozenset(x), x) for x in items).values()
[('b', 'a'), ('c', 'd')]

这会保留顺序,您说您可以删除其中一个重复项(保留最后一个)

到目前为止给出的答案也改变了元素:

>>> set(tuple(sorted(t)) for t in [('b', 'a'), ('c', 'd')])
set([('a', 'b'), ('c', 'd')])
>>> set(frozenset(tuple) for tuple in [('b', 'a'), ('c', 'd')])
set([frozenset(['a', 'b']), frozenset(['c', 'd'])])

这将使元素保持不变

>>> OrderedDict((frozenset(x), x) for x in [('b', 'a'), ('c', 'd')]).values()
[('b', 'a'), ('c', 'd')]