在python中的字符串元组集

时间:2015-01-02 23:09:55

标签: python set tuples

我怎么能找到字符串元组的集合?

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

列表

对我而言 ('a', 'b')('b', 'a') 相同。有没有任何功能 python哪个可以识别并删除其中一个?

3 个答案:

答案 0 :(得分:4)

只需对你的元组进行排序:

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 3中扩展collections.MutableSet()collections.abc.MutableSet)来封装该行为:

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

答案 1 :(得分:2)

怎么样:

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

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

print(set_)

?在Python 3.4上测试。

答案 2 :(得分:1)

到目前为止,答案根本不保留顺序,如果这对您很重要,那么请使用它:

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