2016-09-29 11 views
0

私はdictsのリストを持っています(各エントリがdictであるリスト)。それぞれのdictには異なるキーセットがあるため、1つのdictにはリスト内の他のdictsには存在しないキーが存在することがあります。私はこのリストの中で特定の順序の辞書を見つけようとしています。基本的に、このリストはwiresharkキャプチャからのものであり、特定のパケットを探したいと思う。リストの中央には特定の一連のパケットがあります。また、このシーケンスの中には、私が無視/フィルターしたいパケットがいくつかあります。これを達成する最良の方法は何ですか? A_CONSTANT_I_HAVE_DEFINED, ANOTHER_CONSTANT, SOME_OTHER_CONSTANT:私はフィールドsome_fieldと異なるsome_other_field、および異なる定数を持っているかそれぞれ異なるキーを持つdictのリスト、dictsのシーケンスを探す最良の方法

for i in range(len(packets)): 
    p = packets[i].fields # This method turns the packet object into a dict 
    try: 
     if p['some_field'] == A_CONSTANT_I_HAVE_DEFINED: 
      # Mark this packet as part of the sequence 
      # Save as part of sequence 
      first_packet = p 
      # Do not check for this condition again! I want to go to the next 
      # iteration once I come across a packet with similar property 
      # (the equality satisfied) 
     if p['some_field'] == ANOTHER_CONSTANT: 
      # Same as above 
      second_packet = p 
     if p['some_other_field'] == SOME_OTHER_CONSTANT: 
      # Same as above 
      third_packet = p 
    except KeyError as err: 
     pass 

# Now I should have first_packet, second_packet and third_packet 
# The list packets will always have the sequence of packets I am looking for 

注:私は下に書かれたいくつかの擬似コードを持っています。私は明確ではないですsome_other_field

答えて

0
first_packet = None 
second_packet = None 
third_packet = None 
packets_found = 0 

for packet in packets: 
    val = packet.get('some_field', None) 
    if (val == A_CONSTANT_I_HAVE_DEFINED) and (first_packet is not None): 
     first_packet = packet 
     packets_found += 1 
    elif (val == ANOTHER_CONSTANT) and (second_packet is not None): 
     second_packet = packet 
     packets_found += 1 
    elif (packet.get('some_other_field', None) == SOME_OTHER_CONSTANT) and (third_packet is not None): 
     third_packet = packet 
     packets_found += 1 

    if packets_found == 3: 
     break 
+0

条件を満たすと、つまりシーケンス内のパケットの1つが見つかったら、その比較をもう一度やり直すべきではありません。 – nnja

0

に同じ、some_fieldは、リスト内の各アイテムにはないかもしれないことに注意してください、これは役立つかもしれない:

a = [{'a': 1}, {'a':1, 'b':1}, {'c':1}] 
filtered_list = filter(lambda x: x.get('a') or x.get('b'), a) 
# OP [{'a': 1}, {'a': 1, 'b': 1}] 

は、この情報がお役に立てば幸いです。

関連する問題