如何检查两个列表之间的差异,每个列表都有字典作为列表成员?

时间:2017-09-08 12:47:53

标签: python-2.7

我有两个文件(旧的和当前的)。我将从客户端收到的先前值存储在旧文件(olddata.txt)中,并将当前从客户端接收的值存储在cdata.txt中

示例:在olddata.txt中:{" cdata":[{" time":" 14:14:20"," cname&# 34;:" client1"," sig":" somedata"}]}

在cdata.txt中:{&#34; cdata&#34;:[{&#34; time&#34;:&#34; 14:14:30&#34; ,&#34; cname&#34;:&#34; client1&#34;,&#34; sig&#34;:&#34; somedata&#34;},{&#34; time&#34;:&# 34; 14:14:30&#34;,&#34; cname&#34;:&#34; client2&#34;,&#34; sig&#34;:&#34; somedata&#34;}]} < / p>

它存储为JSON。

我试图根据以前收到的时间戳和当前收到的时间戳找到客户端响应的阈值(10秒)。

但问题是有些情况下最初发送了5个客户端值,后来只发送了2个。在这种情况下,我想跟踪之前没有发送其值的3个客户端(阈值)。此外,可能是从客户端收到的新数据有6个客户端值,之前只发送了3个。 (我在一台机器上模拟多个客户端)

我试过这个:     对于cdatadata中的outloop:         ccname = outloop.get(&#34; cname&#34;)         ctime = outloop.get(&#34; timC&#34;)         对于oldData中的项目:             ocname = item.get(&#34; cname&#34;)             otimC = item.get(&#34; timC&#34;)             如果ccname == ocname:             ........             ....

但它仅检查匹配的客户端。

道歉,如果它是一个愚蠢的问题。我是python和词典列表的新手。

1 个答案:

答案 0 :(得分:0)

我会像这样接近这个。首先将您的数据放入一个结构中,以便为每个客户端保存详细信息。 e.g。

{
  "client1": {
    "new": {
      "cname": "client1", 
      "sig": "somedata", 
      "time": "14:14:30"
    }, 
    "old": {
      "cname": "client1", 
      "sig": "somedata", 
      "time": "14:14:20"
    }
  }, 
  "client2": {
    "new": {
      "cname": "client2", 
      "sig": "somedata", 
      "time": "14:14:30"
    }
  }, 
  "client3": {
    "old": {
      "cname": "client3", 
      "sig": "somedata", 
      "time": "14:14:20"
    }
  }
}

使用类似

的脚本
import json
from collections import defaultdict
oldnew = defaultdict(dict)

with file('olddata.txt') as f:
    for e in json.load(f)['cdata']:
        oldnew[e['cname']]['old'] = e

with file('cdata.txt') as f:
    for e in json.load(f)['cdata']:
        oldnew[e['cname']]['new'] = e

print json.dumps(oldnew,indent=2)

然后编写逻辑来检查每个客户端的数据,并决定如何处理旧数据和新数据。你可以从制作像

这样的报告开始
client____ new_______ old_______
   client1   14:14:30   14:14:20
   client2   14:14:30       None
   client3       None   14:14:20

代码如

def val(d,*p):
    for i in p: d = d.get(i,{})
    return None if d == {} else d

print "client____ new_______ old_______"
for cname, c in oldnew.items():
    otime, ntime = val(c,'old','time'), val(c,'new','time')
    print "%(cname)10s %(ntime)10s %(otime)10s" % locals()

然后改进它,直到你想要的逻辑清楚。