【问题标题】:Remove tuples that are duplicate combinations of lists in the list of these tuples删除这些元组列表中重复的列表组合的元组
【发布时间】:2019-02-01 00:45:02
【问题描述】:

我有清单

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5), ([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]

我正在尝试删除具有相同列表组合的重复元组。

例如,([4, 7, 9], [3], 5.5)([3], [4, 7, 9], 5.5) 是相同的。因此删除重复元组后的输出将如下所示:

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5)]

允许元组中列表的任何顺序。

编辑(基于@DYZ 的反馈): 不允许完全扁平化的元组。例如,(4,7,9,3,5.5) 是不允许的。输出的格式仍应为:([list 1], [list2], constant)

我尝试改编Remove duplicated lists in list of lists in Python中相关的一个方法,但是我已经陷入了心理僵局..

是否可以在链接的问题中进一步修改代码,或者有更有效的方法来做到这一点?

【问题讨论】:

  • @BercoviciAdrian 你这是什么意思?
  • 是否允许在结果列表中包含完全扁平化的元组? (没有任何子列表。)例如,(4, 7, 9, 3, 5.5).
  • @DYZ 如果您的意思是 (4,7,9,3,5.5),例如那么不,这是不允许的。输出的格式仍应为 ([list 1], [list2], constant)
  • 您可能希望将此约束添加到问题中。
  • @DYZ 感谢您的反馈!我马上加进去

标签: python python-3.x list duplicates tuples


【解决方案1】:

按长度对 a 的元素进行排序(将未列出的元素的长度设置为 -1)。然后找到结果排序的唯一元素的索引,并使用这些索引到未排序的列表中。

asort = [sorted(aa, key= lambda x: len(x) if isinstance(x,list) else -1) for aa in a]
inds = [i for i,x in enumerate(asort) if asort.index(x)==i]
a = [a[i] for i in inds]

【讨论】:

  • 感谢您的解释和帮助!它对我也很好用:)
【解决方案2】:

您可以使用字典来完成这项工作。创建一个空字典:

from itertools import chain
d = {}

将每个元组及其扁平形式分别作为值和键插入字典:

for t in a:
    # Flatten the tuple
    flat = chain.from_iterable(part if isinstance(part,list) else [part] 
                               for part in t)
    maps_to = frozenset(flat) # Sets cannot be used as keys
    d[maps_to] = t # Add it to the dict; the most recent addition "survives"

list(d.values())
#[([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]

【讨论】:

  • 谢谢它的工作!字典的美妙之处.. 一个我还没有掌握的使用:/
猜你喜欢
  • 1970-01-01
  • 2019-04-23
  • 2018-10-17
  • 1970-01-01
  • 2020-05-31
  • 2018-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多