我怎么能找到字符串元组的集合?
例如,有一个[('a', 'b'), ('b', 'a'), ('c','d')]
对我而言 ('a', 'b')
与('b', 'a')
相同。有没有任何功能
python哪个可以识别并删除其中一个?
答案 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')]