2015-01-02 3 views
0

Как я могу найти набор кортежей строки?Набор строковых кортежей в python

Например есть список [('a', 'b'), ('b', 'a'), ('c','d')]

Для меня ('a', 'b') такое же к ('b', 'a'). Есть ли какая-либо функция в python , которая может идентифицировать и удалить один из них?

+0

Вы не указали, если заказ важен – jamylak

ответ

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

Вы можете расширить collections.MutableSet() (collections.abc.MutableSet в Python 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))) 

Demo:

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

Пожалуйста, проверьте с помощью 'OP', если ваш выход в этом случае правильный:' >>> set (tuple (sorted (t)) для t в [in] ',' a '), (' c ',' d ')]) set ([(' a ',' b '), (' c ',' d ')]) ' – jamylak

2

Как насчет:

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

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

print(set_) 

? Протестировано на CPython 3.4.

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

Это будет держать элементы того же

Смежные вопросы