繁体   English   中英

从元组列表中删除元组

[英]Removing a tuple from list of tuples

我有一个看起来像这样的元组列表;

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')]

我想在元组的第一个元素与另一个元组的第二个元素匹配并且同时,元组的第二个元素与相同的其他元组的第一个元素匹配时删除元组。 OutputList将如下所示;

OutputList = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')]

除了遍历所有元组进行比较并保存到新的元组列表之外,还有没有更简单的方法可以做到这一点?

谢谢。

进行两组设置:第一组具有原始元组,第二组具有已交换元素的元组。 然后取两个集合的交集。 这些是要删除的元组。 用除以下以外的所有元组创建一个新列表:

>>> ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')]
>>> set1 = set(ListTuples)
>>> set2 = set((e2, e1) for e1, e2 in ListTuples)
>>> to_remove = set1 & set2
>>> to_remove
set([('192.168.1.103', '192.168.1.100'), ('192.168.1.100', '192.168.1.103')])
>>> NewList = [t for t in ListTuples if t not in to_remove]
>>> NewList
[('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')]

这将是O(n),而搜索列表将是O(n ** 2)。

好吧,如果要相互比较元组,则必须遍历它们,但是至少您可以使用带有反向元素的临时集以加快查找速度:

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'),
              ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')]

seen = set()
for element in ListTuples:
    if element in seen:
        seen.discard(element)
    else:
        seen.add(tuple(reversed(element)))
OutputList = [tuple(reversed(element)) for element in seen]

print(OutputList)  # [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')]

它不会保持顺序。

使用collections.Counter计数每个已排序的元组出现的次数,然后过滤出计数大于一的那些元组:

from collections import Counter

ListTuples = [('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102'), ('192.168.1.100', '192.168.1.103'), ('192.168.1.103', '192.168.1.100')]

counts = Counter(tuple(sorted(t)) for t in ListTuples)
OutputList = [k for k in counts if counts[k] == 1]

>>> OutputList
[('192.168.1.100', '192.168.1.101'), ('192.168.1.100', '192.168.1.102')]

请注意,这不会保留原始列表中项目的顺序。 在这种情况下,我不知道这对您是否重要。

在对每个元组进行排序时,效率也有些低下,但是必须考虑到项目顺序,并且在一般情况下,如果每个元组可以包含2个以上的元素,则对元组进行排序将是一种方法走。

您可以像这样将其设置为单线:

OutputList = [k for k, count in Counter(tuple(sorted(t)) for t in ListTuples).items() if count == 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM