1

いくつかのアルゴリズムを実行した後、次のようなリストが表示されます。

l = Set([(integer_4_digits, integer_n_digits], ..)
ex: l = Set([(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)])
l = list(l) #all tuples must exist once. need to get items by index to match (perhaps?)

このリストの各タプルには、最初の項目に4桁の整数(正)があり、2番目の項目には別の正の整数があります。

私が欲しいのは:

(リストまたはタプルの)新しいリストを作成し、可能なすべての組み合わせが(リストまたはタプルで)グループ化され、クロスマッチングを使用します。これには、5番目(またはタプル+タプル+ブールの場合は3番目)の要素が含まれます。TrueまたはFalse、新しく一致した2つの交差したタプルの最初の4桁の整数が同じであるかどうかによって異なります(例:1011 == 1011so Bool = True)。

したがって、このプロセスの後、次のようなものを取得したいと思います。

new_list = [(l[0], l[1], False), (l[0], l[2], False), (l[0], l[3], False), (l[0], l[4], True) ..
            (l[1], l[2], False), (l[1], l[3], False), (l[1], l[4], False), ..
            (l[2], l[3], False), (l[2], l[4], False), (l[2], l[5], False), ..]

ご覧のとおりnew_list、重複一致は含まれていません。(一度だけl[0]一致します。一致するタプルがa to beであるか、b to a( )または()l[1]であるかは関係ありません。l[0],l[1],..l[1],l[0],..

これで、ネストされたfor e in lループを使用して最後のe要素をポップe[0]し、boolのチェックを実行し、新しいタプル(またはリスト)を作成してnew_listリストに追加することで、これを実現できます。

では、どうすればこれを行うことができますか?どうすればいいですか?

4

1 に答える 1

4

使用itertools.combinations(); それはあなたが探している組み合わせを作成します。リスト内包表記とともに、次のように設定する必要があります。

from itertools import combinations

[(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]

Setこの型はPythonの組み込みのネイティブ型になっていることに注意してください。setネイティブバージョンには(小文字)を使用してください。これを機能させるために、セットをリストに変換する必要はありません。itertoolsはどちらの方法も気にしません。新しい{elem, elem, elem}setリテラル構文を使用することもできます。

これにより、次のものが生成されます。

>>> from itertools import combinations
>>> l = {(1011, 123556), (1041, 424553), (1241, 464096), (1027, 589325), (1011, 432341), (1031, 423076)}
>>> [(i, j, i[0] == j[0]) for i, j in combinations(l, 2)]
[((1041, 424553), (1027, 589325), False), ((1041, 424553), (1011, 123556), False), ((1041, 424553), (1031, 423076), False), ((1041, 424553), (1241, 464096), False), ((1041, 424553), (1011, 432341), False), ((1027, 589325), (1011, 123556), False), ((1027, 589325), (1031, 423076), False), ((1027, 589325), (1241, 464096), False), ((1027, 589325), (1011, 432341), False), ((1011, 123556), (1031, 423076), False), ((1011, 123556), (1241, 464096), False), ((1011, 123556), (1011, 432341), True), ((1031, 423076), (1241, 464096), False), ((1031, 423076), (1011, 432341), False), ((1241, 464096), (1011, 432341), False)]
于 2012-10-06T19:34:53.383 に答える