Python元组列表

3 投票
5 回答
5379 浏览
提问于 2025-04-17 13:29

我刚开始学Python和编程,遇到了一些问题需要帮助:我之前在程序中通过循环创建了一个列表,这个列表里有24个四元组:

elementary = [(23, 1, 18, 4), (23, 1, 6, 16), (23, 1, 4, 18), (23, 2, 18, 3), (23, 2, 12, 9), (23, 2, 9, 12), (23, 2, 3, 18), (23, 3, 18, 2), (23, 3, 2, 18), (23, 4, 18, 1), (23, 4, 1, 18), (23, 5, 14, 7), (23, 5, 7, 14), (23, 6, 16, 1), (23, 6, 9, 8), (23, 6, 8, 9), (23, 6, 1, 16), (23, 7, 14, 5), (23, 7, 5, 14), (23, 8, 9, 6), (23, 8, 6, 9), (23, 9, 12, 2), (23, 9, 8, 6), (23, 9, 6, 8), (23, 9, 2, 12), (23, 12, 9, 2), (23, 12, 2, 9), (23, 14, 7, 5), (23, 14, 5, 7), (23, 16, 1, 6), (23, 18, 4, 1), (23, 18, 3, 2), (23, 18, 2, 3), (23, 18, 1, 4)]

现在我想去掉那些只是顺序不同的四元组。换句话说,在第一个四元组((23,1,18,4))之后,我想去掉像(23,1,4,18)(23,4,1,18)这样的组合。如果可以的话,我希望能在整个列表中做到这一点,这样我最后只剩下6个完全不同的四元组。有没有办法在不回头修改之前代码的情况下做到这一点?非常感谢你的帮助!

5 个回答

0

当你看到 sorted(tuple1) == sorted(tuple2) 这样的代码时,你可以知道这两个元组是等价的组合。

这段代码简洁明了:

>>> set(map(tuple, map(sorted, elementary)))
set([(5, 7, 14, 23), (6, 8, 9, 23), (2, 3, 18, 23), 
     (1, 4, 18, 23), (1, 6, 16, 23), (2, 9, 12, 23)])

如果你需要保持每个不同元组的顺序,那就需要多花点功夫:

>>> uniq = set()
>>> for t in elementary:
    s = tuple(sorted(t))
    if s not in uniq:
        uniq.add(s)
        print t

(23, 1, 18, 4)
(23, 1, 6, 16)
(23, 2, 18, 3)
(23, 2, 12, 9)
(23, 5, 14, 7)
(23, 6, 9, 8)
2

这段代码是一行代码,它会对每个四元组进行排序,然后生成一个集合,这样就能去掉重复的项。我假设你的四元组中的元素顺序是可以改变的。

set(tuple(sorted(i)) for i in elementary)

>>> set((5, 7, 14, 23), (6, 8, 9, 23), (2, 3, 18, 23), (1, 4, 18, 23), (1, 6, 16, 23), (2, 9, 12, 23))
3

这样怎么样:

{tuple(sorted(t)): t for t in elementary}.values()

撰写回答