【问题标题】:How can I get unique arrays in Python?如何在 Python 中获取唯一数组?
【发布时间】:2023-01-28 21:47:43
【问题描述】:

我得到了一个相当大的长度为 2 的数组 (List[List[int, int]]) 我怎样才能独特地排列它们?最好不使用不同的库

我见过几个使用 numpy 的解决方案,但我不太可能在奥林匹克竞赛中使用它

# Example input:
nums = [[2, 9], [3, 6], [9, 2], [6, 3]]

for i in nums:
    # some code here

# Output:
# nums = [[2, 9], [3, 6]]

我试过这样做,但我想这不是一个非常快速的解决方案

# Example input:
nums = [[2, 9], [3, 6], [9, 2], [6, 3]]

unique = []
for i in nums:
    if sorted(i) not in unique:
        unique.append(sorted(i))

# Output:
print(unique) # [[2, 9], [3, 6]]

【问题讨论】:

  • 是否允许内置库?
  • 当然内置库没有限制
  • 似乎“独特”是指“与订单无关”;如果是这样,将您的列表变成集合(如果需要,然后返回列表)
  • 外部列表中元素的顺序是否重要,或者结果是否可以重新排序(使集合更容易使用)?
  • 顺序不重要

标签: python algorithm


【解决方案1】:

正如@Swifty 提到的,您可以使用set 来解决这个问题。通过 set 构造函数发送每一对以对它们进行排序,然后将其转换为 tuple 以使其可散列并再次使用 set 删除重复的元组。

nums = [[2, 9], [3, 6], [9, 2], [6, 3]]

num_tuples = set(tuple(set(pair)) for pair in nums)

print(num_tuples)  # {(9, 2), (3, 6)}

【讨论】:

    【解决方案2】:

    将每一对转换为排序的tuple,将它们全部放入set,然后将其转换回列表列表。

    >>> nums = [[2, 9], [3, 6], [9, 2], [6, 3]]
    >>> {tuple(sorted(n)) for n in nums}
    {(2, 9), (3, 6)}
    >>> [list(t) for t in {tuple(sorted(n)) for n in nums}]
    [[2, 9], [3, 6]]
    

    tuple 是必需的,因为集合(通过 {} 集合理解表达式创建)需要包含可散列(不可变)对象。

    【讨论】:

      【解决方案3】:

      要处理不可散列的集合,您可以通过以下方式创建一组冻结集:

      unique = {frozenset(i) for i in nums}
      

      然后你可以使用任何你想要的方式将结果变成你想要的对象。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2010-09-10
        • 2014-11-03
        • 2012-05-11
        相关资源
        最近更新 更多