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タプルだけになります。プログラムの早い段階で戻って別のことをすることなく、これを行う方法はありますか?どんな助けでも大歓迎です。ありがとう!

4

5 に答える 5

3

どうですか:

{tuple(sorted(t)): t for t in elementary}.values()
于 2013-01-24T03:46:43.973 に答える
2

1 ライナーとして、これは各 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))
于 2013-01-24T03:38:28.757 に答える
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)]
于 2013-01-24T03:44:21.830 に答える
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))

代わりに、これは最初のバージョンよりも少し遅くなります。

于 2013-01-24T03:39:10.063 に答える
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)
于 2013-01-24T03:39:52.443 に答える