2013-01-24 77 views
3

我是一个用python编程的新手,需要一些帮助:我有一个列表,我之前在程序中创建了一个附加循环(即我不能重新定义我的现在列表解决我的问题),24个4元组:元组的Python列表

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

回答

2

作为单线程,它对每个4元组进行排序,然后创建一组结果,这样可以消除重复项。我假设你的4元组被允许改变元素的顺序。

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

这破坏了原始的元组排序,这可能是也可能不是问题... – 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)) 

取而代之,但这会比第一个版本慢一点。

+0

非常感谢大家!我结束了使用elementary_unique设置版本,但我会给所有的建议一个镜头作为一个学习练习。再次感谢! – user2006083

1

无论何时只要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)] 
+0

您的格式爆炸.... – tacaswell

3

如何:

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