Python元组列表

3

我是一个python和编程新手,需要一些帮助:我之前在程序中通过循环添加的方式创建了一个列表(也就是说现在不能重新定义我的列表来解决我的问题),这个列表包含了24个4元组:

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个完全不同的4元组。是否有任何方法可以在不返回并在程序中进行某些不同的处理的情况下完成此操作?非常感谢您的帮助。谢谢!


2
欢迎来到SO。你尝试过什么了吗? - tacaswell
5个回答

3
怎么样:
{tuple(sorted(t)): t for t in elementary}.values()

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))

这会破坏原始元组的顺序,可能是一个问题,也可能不是... - wim

0

你真的只有24个吗?如果是这样,一个速度较慢但有一些不必要的内存分配的解决方案可能会在这里很好地工作,并节省您的编程时间:

elementary_unique = set(tuple(sorted(t)) for t in elementary)

现在 elementary_unique 是一个集合而不是列表 - 如果有影响,你可以使用它

elementary_unique = list(set(tuple(sorted(t)) for t in elementary))

不过,这种方法会比第一种方法慢一些。


非常感谢大家!最终我使用了 elementary_unique 集合版本,但是我会尝试所有建议作为学习练习。再次感谢! - user2006083

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)

0

如果你真的想深入比较:

In [1028]: 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)]

In [1029]: for e in elementary:                                                                                                                                  
               add = True                                                                                                                                                   
               for a in answer:                                                                                                                                                 
                   if all(_e in a and e.count(_e)==a.count(_e) and len(e)==len(a) for _e in e):
                       add = False
               if add:
                   answer.append(e)    

In [1030]: answer
Out[1030]: 
[(23, 1, 18, 4),
 (23, 1, 6, 16),
 (23, 2, 18, 3),
 (23, 2, 12, 9),
 (23, 5, 14, 7),
 (23, 6, 9, 8)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接