あなたはvariable1
そもそも大きな問題は、一般的に悪い示していますsign - 複数の値を使用する場合は、データ構造を使用し、番号の付いた名前の変数はあまり使わないでください。これはあなたのコードを何度も何度もやり直すのをやめ、バグを止めるのを助けます。
は、のではなく、リストのリストを使用してみましょう:
values = [
[(111, 222), (111, 333), (111, 444)],
[(555, 333), (555, 444), (555, 777)],
[(123, 444), (123, 888), (123, 999)]
]
は、今、私たちはサブリスト内の各タプルの唯一の第二の要素を取得したいです。
>>> [[item[1] for item in sublist] for sublist in values]
[[222, 333, 444], [333, 444, 777], [444, 888, 999]]
そして、私達は項目間の交差点をしたい、我々は、2つの可能なの様々なペアを取得するためにitertools.combinations()
を使用します:これはlist comprehensionを使用して計算するのは簡単ですので、
>>> for values, more_values in itertools.combinations(new_values, 2):
... set(values).intersection(more_values)
...
{444, 333}
{444}
{444}
、場合私たちは一緒にこれをラップ:
たちを与える
import itertools
values = [
[(111, 222), (111, 333), (111, 444)],
[(555, 333), (555, 444), (555, 777)],
[(123, 444), (123, 888), (123, 999)]
]
sets_of_first_items = ({item[1] for item in sublist} for sublist in values)
for values, more_values in itertools.combinations(sets_of_first_items, 2):
print(values.intersection(more_values))
を:
{444, 333}
{444}
{444}
私がここで行った変更は、リストを作成してセットにするのを避け、リストの理解ではなくジェネレータ表現を使用することを怠って評価するので、内側のリストをセットしました。
あなたは私たちが交差点を生成するために使用されているリストのインデックスを望んでいた場合、最終的な注意として、それはthe enumerate()
builtinを行うに簡単です:
sets_of_first_items = ({item[1] for item in sublist} for sublist in values)
for (first_number, first_values), (second_number, second_values) in itertools.combinations(enumerate(sets_of_first_items), 2):
print("Intersection of {0} and {1}: {2}".format(first_number, second_number, first_values.intersection(second_values)))
たちを与える:
Intersection of 0 and 1: {444, 333}
Intersection of 0 and 2: {444}
Intersection of 1 and 2: {444}
編集:
noted by tonyl7126と同様に、これは大きなデータ構造を使用することで大きな助けになる問題です。ここでの最良の選択肢は、一連の製品IDにユーザーIDの辞書を使用することです。セットが必要なときだけリストとしてデータを格納し、それを後でセットに変換する理由はなく、dictは保管しようとしているデータのタイプにとってはるかに優れたソリューションです。
import itertools
values = {
"111": {222, 333, 444},
"555": {333, 444, 777},
"123": {444, 888, 999}
}
for (first_user, first_values), (second_user, second_values) in itertools.combinations(values.items(), 2):
print("Intersection of {0} and {1}: {2}".format(first_user, second_user, first_values.intersection(second_values)))
たちを与える:
は、次の例を参照してくださいあなたはまだPythonで辞書について読んだ場合
Intersection of 555 and 123: {444}
Intersection of 555 and 111: {444, 333}
Intersection of 123 and 111: {444}
一般的には、出力例を得ることをお勧めします。 –
これらのリストは、各タプルの2番目の要素によって順序付けられていますか?あなたはそれらのリストの要素を並べ替えることが許されていますか?もしそうなら、マージソートのようなアルゴリズムを試して、データのコピーを避けることができます。 – liori
良い点。出力は元のlist1とlist2の2番目の要素、つまり(ID、値)タプルの共通の値の交点を含むリストまたはセットになると期待します。だから、i_of_1と2のために、私は[333,444]を期待しています。 – CJH