1

こんにちは、タイトルでこれを適切に説明するのは難しいのですが、まず私のデータについて説明させてください。次のような形式のリスト内に 40 個のリストが格納されています。

data[0] = [[value1 value2 value3,80],[value1,90],[value1 value3,60],[value2 value3,70]]
data[1] = [[value2,40],[value1 value2 value3,90]]
data[2] = [[value1 value2,80],[value1,50],[value1 value3,20]]
   .
   .
   .

今、私は次のような出力を期待しています:

data[0] = [[value1 value2 value3,80],[value1,90],[value1 value3,60],[value2 value3,70],[value2,0],[value1 value2,0]]
data[1] = [[value2,40],[value1 value2 value3,90],[value1,0],[value1 value3,0],[value2 value3,0],[value1 value2,0]]
data[2] = [[value1 value2,80],[value1,50],[value1 value3,20],[value1 value2 value3,0],[value2 value3,0],[value2,0]]    

これを読むのは少し複雑ですが、データの優れたデモがあることを確認したかったのです。したがって、基本的にすべてのリストには、すべてのリストに存在する値のすべての可能な組み合わせが必要です。その組み合わせが標準としてそのリストに存在しない場合、その頻度 (2 番目のフィールド) は 0 です。

ご協力ありがとうございます。これは 40 の異なるリストの交差点であるため、迅速かつ効率的である必要があることに注意してください。これをどのように行うのが最善かわかりません...

編集: 私もすべての「値」を知っているわけではありません。簡単にするために、ここに 3 つの異なる値 (値 1、値 2、値 3) を書きました。私のプロジェクトでは、値が何であるか、または異なる値がいくつあるかわかりません(少なくとも数千あることはわかっています)

編集 2: ここにいくつかの実際の入力データがあります。実際の出力データはありませんが、試してみます。

data[0] = [['destination_ip:10.32.0.100 destination_service:http destination_port:80 protocol:TCP syslog_priority:Info', '39.7769'], ['destination_ip:10.32.0.100 destination_service:http destination_port:80 protocol:TCP', '39.7769'], ['destination_ip:10.32.0.100 destination_service:http destination_port:80 syslog_priority:Info', '39.7769'], ['destination_ip:10.32.0.100 destination_service:http destination_port:80', '39.7769'], ['destination_ip:10.32.0.100 destination_service:http protocol:TCP syslog_priority:Info', '39.7769']]


data[1] = [['syslog_priority:Info', '100'], ['destination_ip:10.32.0.100 syslog_priority:Info destination_service:http destination_port:80 protocol:TCP', '43.8362'], ['destination_ip:10.32.0.100 syslog_priority:Info destination_service:http destination_port:80', '43.8362'], ['destination_ip:10.32.0.100 syslog_priority:Info destination_service:http protocol:TCP', '43.8362'], ['destination_ip:10.32.0.100 syslog_priority:Info destination_service:http', '43.8362']]


data[2] = [['destination_ip:10.32.0.100 destination_port:80 destination_service:http syslog_priority:Info protocol:TCP', '43.9506'], ['destination_ip:10.32.0.100 destination_port:80 destination_service:http syslog_priority:Info', '43.9506'], ['destination_ip:10.32.0.100 destination_port:80 destination_service:http protocol:TCP', '43.9506'], ['destination_ip:10.32.0.100 destination_port:80 destination_service:http', '43.9506'], ['destination_ip:10.32.0.100 destination_port:80 syslog_priority:Info protocol:TCP', '43.9506']]
4

4 に答える 4

4

セットを使用できるように聞こえます:

>>> {1, 2, 3, 4, 5} & {2, 3, 4, 5, 6, 7} & {3, 4, 5}
{3, 4, 5}

&セットの交差演算子です。リストのセットを取得します (これにより、重複する要素が削除されset(mylist)ます。

|編集:あなたのコメントに照らして、あなたが必要としているのは、交差点ではなく、ある種のユニオン(ユニオン演算子である)であるようです。リストの2つのリストに対するコメントで必要なことを行う関数は次のとおりです。

def function(first, second):
    first_set = {tuple(i) for i in first}
    second_set = {tuple(i) for i in second}
    return (first_set | {(i[0], 0) for i in second_set},
            second_set | {(i[0], 0) for i in first_set})

>>> a = [(1,60),(3,90)]
>>> b = [(2,30),(4,50)]
>>> x, y = function(a, b)
>>> print(x)
{(2, 0), (3, 90), (1, 60), (4, 0)}
>>> print(y)
{(3, 0), (4, 50), (1, 0), (2, 30)}
于 2013-08-09T12:36:07.060 に答える
1

辞書が必要なように聞こえますが、「値」のリストであるキーを比較したいのですが、頻度である辞書の値は比較したくありません。もちろん、データを辞書として再構築する必要はありませんが、そのほうが理にかなっています。

さて、実際の答えとして、新しいリスト/辞書を作成して、すべてのキー/「値のリスト」の完全なリストを1つにまとめます。次に、もう一度行って、欠落している要素を欠落しているリストに追加します。外側のループは 40 回通過します。最初の外側のループは O(n* 2) です。ここで、n は一意のキーの総数ですが、平均的なケースは n *2 未満になると思います。2 番目の外側のループも O(n**2) です。

強引すぎないことを願っています。少なくとも、n 0-40 の data[n] を data[n+m] と比較するよりはましです...外側のループでは 40**2 になります...これはまだ定数ですが、明らかに80より大きいもの。

于 2013-08-09T13:05:44.533 に答える
1

間違っている場合は訂正してください。ただし、これに対する最善の解決策には、必要な出力ごとの辞書と、キーのマスター セットが含まれると思います。セットは基本的に、重複を許可せずにすべての値を格納します。上記の例では、次のようにします。

master_set = set()
for current_list in list_of_lists:
    master_set |= [entry[0] for entry in current_list] 

|=実質的にセットの和集合演算子はどこにありますか。

そのセットを取得したら、関連する値またはゼロを含む各エントリの辞書を構築しようとしています。最初に辞書を作成し、次に存在しない項目の結果を追加します。

full_dictionary = {}
for entry in master_set:
    full_dictionary[entry] = [thing[1] for thing in current_list if thing[0] == entry]

そして、取得したリストごとに完全な辞書を生成するだけです。

あるいは、データの入力方法を選択できる場合、または合理的に再構築したい場合は、辞書内包表記を使用することをお勧めします。これにより、この全体がより簡単になります。

new_dict = {value[0]: value[1] for value in current_list}

また、質問の解釈に少し問題がありますが、それが正確でない場合はお知らせください。修正できます。

于 2013-08-09T13:18:52.283 に答える