【问题标题】:How to return unique elements in list of tuple as another tuple如何将元组列表中的唯一元素作为另一个元组返回
【发布时间】:2020-11-30 17:57:01
【问题描述】:

假设我有一个元组列表a=[(0,1),(2,0),(1,4)],我想将每两个元组的唯一元素作为一个新元组返回。例如(0,1)(2,0) 返回(1,2)。还有(0,1)(1,4) 返回(0,4)

因此,输出为unique=[(1,2),(0,4)]

我尝试了下面的代码,但似乎我的路径不正确:

from itertools import combinations
a=[(0,1),(2,0),(1,4)]

b=list(combinations(a,2))
def myComp(pair1, pair2):
    if any(x == y for x, y in zip(pair1, pair2)):
        return(pair1,pair2)

d=[]
for i in range(len(b)):
    c=myComp(b[i][0],b[i][1])
    d.append(c) 

【问题讨论】:

  • 您能否详细说明为什么 2 对会返回该特定对?是什么让事物与众不同?
  • 我认为是因为对于两个给定的对@Ironkey,返回的对中的数字不会在任何地方重复
  • 哦,我没看到,让我写一个答案!
  • 因为例如成对的 (0,1) 和 (2,0),0 在它们中都是常见的。然后它应该返回不常见的元素,即 (1,2)。
  • 哦,他在 cmets 中说过谢谢@Ironkey

标签: python list tuples comparison combinations


【解决方案1】:

首先,将a 中的所有元组转换为集合。

a2 = [set(i) for i in a]

然后,取a2 的两个元素的组合。

b2 = itertools.combinations(a2, 2)
# print(list(b2)) gives:
# [({0, 1}, {0, 2}), ({0, 1}, {1, 4}), ({0, 2}, {1, 4})]

然后,对于b2 中的每一对,求对称差。

answer = [tuple(x ^ y) for x, y in b2]
# answer: [(1, 2), (0, 4), (0, 1, 2, 4)]

就像在 cmets 中提到的 Ironkey 一样,您在最后一个元素中得到 (0, 1, 2, 4),因为您正在比较 (0, 2)(1, 4),并且这些元组中的所有元素都是互斥的。

要过滤掉四元素元组,您可以简单地添加该条件:

answer_f = [x for x in answer if len(x) == 2]
# answer_f: [(1, 2), (0, 4)]

【讨论】:

  • 所有元组的长度都应该是两个。
  • @Aras 那么您的问题定义不正确。在最后一个组合中,您正在比较 (0, 2) 和 (1, 4),这些元组中的所有元素都是互斥的。你应该选择哪两个?或者您是否希望仅当此操作给出一个二元素元组时才包含答案?
  • 如果您使用给定列表 [(0,1),(0,2),(0,3),(1,2),(1,3),(1, 4),(2,3)] c 给出 10 对元组,然后我想要 10 个唯一的元组。
  • 你的问题被定义得非常可怕......如果你想要一个具有输入列表长度的输出列表,这将不适用于你作为第一个输入提供给我们的内容......[(0,1),(2,0),(1,4)] 将只能返回[(1, 2), (0, 4)](长度为2)
  • @Ironkey 我回滚了您的编辑,因为 OP 可以根据需要自行将这些行放在一起。将一堆行组合成一行会使阅读和调试变得很痛苦,所以我宁愿 OP 如果他们真的愿意,他们自己去完成那个练习,而不是给他们那个功能。
【解决方案2】:

没有任何列表比较的粗略答案:

from itertools import combinations

a = [(0,1),(0,2),(0,3),(1,2),(1,3),(1,4),(2,3)]

uniques = []
for x, y in combinations(a,2):
    z = []
    for i in x:
        if i not in y:
           z.append(i)
    for i in y:
        if i not in x:
           z.append(i)
    if len(z) == 2:
        uniques.append(tuple(z))

print(list(set(uniques)))
[(0, 1), (2, 4), (1, 2), (0, 4), (3, 4), (0, 3), (2, 3), (0, 2), (1, 3)]

【讨论】:

  • 代码重复。例如对于列表 a=a=[(0,1),(0,2),(0,3),(1,2),(1,3),(1,4),(2,3) ] 它输出 (1,2) 和 (2,1)。你能把其中一个退还给我吗?此外,返回相同的元组,如两个 (1,3)。
  • (2,1) 在技术上不是 (1,2) 的副本
  • 看到你接受了这个请注意 @Pranav Hosangadi 发布了一个更有效的答案并且做同样的事情,你所要做的就是使这些相同是将你从他那里得到的输出传递给list(set(output)))
【解决方案3】:

这不使用包。

条件if i != x and a.index(i)<a.index(x) 确保我们不比较相同的元组,而且我们只比较同一对元组一次

然后我们只抓取它们不在其他元组中的元素

条件 if len(m) == 2 and sorted(m) in uniq 确保列表只有 2 个元素长,并且还解决了您关于拥有 (2,1) & (1,2) 的评论

a=[(0,1),(2,0),(1,4),(0,2)]

uniq = []
for i in a:
  for x in a:
    if i != x and a.index(i)<a.index(x):
      m = [y for y in i if y not in x] + [z for z in x if z not in i]
      if len(m) == 2 and tuple(sorted(m)) not in uniq:
        uniq.append(tuple(m))

print(uniq)

>>> [(1, 2), (0, 4)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 2023-01-18
    • 2018-12-25
    • 1970-01-01
    • 2021-06-24
    相关资源
    最近更新 更多