cari

Rumah  >  Soal Jawab  >  teks badan

python 中 如何 获取两个 字典组成的列表的差集?

伊谢尔伦伊谢尔伦2803 hari yang lalu1300

membalas semua(4)saya akan balas

  • PHP中文网

    PHP中文网2017-04-18 10:01:13

    Uin ialah pengecam unik

    dif_user=set.difference(*[{d['Uin']for d in ls}for ls in [before, now]])
    objs=[d for d in before if d['Uin'] in dif_user]
    print objs

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 10:01:13

    Memandangkan setiap satu daripada dua senarai mengandungi berbilang dik, hipotesis:

        list_before = [dict1{},dict2{}]  
        list_now    = [dict3{},dict4{}]

    Maka bolehlah

        dict1['UserName'] != dict3['UserName']  &&
        dict1['UserName'] == dict4['UserName']  

    Dengan mengandaikan bahawa situasi ini juga dianggap mengandungi elemen yang sama, maka anda boleh menggunakan struktur:
    dict{key: set(value)} dan gunakan ciri set() untuk mengetahui sama ada sebelum ini mempunyai && kini tiada koleksi :

    # coding: UTF-8
    before=[{u'UserName':u'@b53413e822cf67a219ab7181b074ccf5', u'RemarkPYQuanPin':u'', u'DisplayName': u'', u'KeyWord': u'iss', u'PYInitial': u'', u'Uin': 12266535, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u4e00\u4e8c\u4e09', u'AttrStatus': 2181050407L}, {u'UserName': u'@4babcdd9789c909048a51a069eb37b635f4f79bc5dfc2b5ae6e7325e16848e2b', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u6696\u6696\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 1589615073, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u6696\u6696\u7684', u'AttrStatus': 4133}, {u'UserName': u'@1f6ddf50c372ba088a9b8f61670a8cfa5873ede35810a60b4076486eac6c20e2', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 2720082935L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u5929\u5929\u60e0\uff5e\u6dd8\u5b9d\u7f51\u5185\u90e8\u6298\u6263', u'AttrStatus': 102469}, {u'UserName': u'@f0142b2f34421927607e46c7c5894fcdb46bdaa173b354ef0d93c7950a3016ac', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 3048262847L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u6298\u6263\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}, {u'UserName': u'@15b51f37927a241f2e0f537c8b446280bdfacd73a8adeacf6db2db096c837a0b', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 3379331828L, u'MemberStatus': 0, u'PYQuanPin': u'', u'RemarkPYInitial': u'', u'NickName': u'\u7075\u7075\u516b', u'AttrStatus': 4133}]
    now=[{u'UserName': u'@9233910c70034bc94ccd683157f5760f600f2bd25ac70c4bb66fd501caca8a8e', u'RemarkPYQuanPin': u'', u'DisplayName': u'\u6696\u6696\u7684o', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 1589615073, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u6696\u6696\u7684', u'AttrStatus': 16781349}, {u'UserName': u'@d5131e8ac7df644c522c9293914b70fe5ebee374f0d42c58157b516a567a7dae', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 2720082935L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u5929\u5929\u60e0\uff5e\u6dd8\u5b9d\u7f51\u5185\u90e8\u6298\u6263', u'AttrStatus': 2147586117L}, {u'UserName': u'@bd7fc47cfb0c9a3f85505c3794d2945ae46edf28c4e68613993f1aaac480b92a', u'RemarkPYQuanPin': u'', u'DisplayName': u'', u'KeyWord': u'', u'PYInitial': u'', u'Uin': 3048262847L, u'RemarkPYInitial': u'', u'PYQuanPin': u'', u'MemberStatus': 0, u'NickName': u'\u6298\u6263\u53d1\u5e03\u5458Summer', u'AttrStatus': 102469}]
    
    
    re=dict()
    
    
    for d in before:             # add values to each set() from dicts in list_before
        if isinstance(d, dict):
            for k in d.keys():
                if k not in re.keys():
                    re[k]=set()
                re[k].add(d[k])
    
    
    for d in now:                 # remove values that in list_now's dicts
        if isinstance(d, dict):
            for k in d.keys():
                if d[k] in  re[k]:
                    #print d[k]
                    re[k].remove(d[k])
                    #if len(re[k])>1:
                    #    re[k].remove(d[k])
    
    for item in re.keys():
        if re[item]==set([]):  # delete keys whose value is set(u'')  
            print item
            del re[item]
            
    print re 
    

    ---------------lebih tua----------------------


    • Senarai anda mengandungi jenis dict dan operasi Baidu ialah jenis set. Jadi kena adjust format dulu.

    • Anda boleh membaca nilai setiap kunci dalam kamus melalui dict.values(), dan kemudian menggunakan operasi diff set.

      • Nilai setiap kunci dalam setiap kamus tidak akan diulang, jika tidak set akan dinyahduplikasi.

    • cth:

    before={'a':1,'b':2}
    now={'a':1,'b':3}
    lostlist=list(set(before.values()).difference(set(now.values())))
    print lostlist

    balas
    0
  • 黄舟

    黄舟2017-04-18 10:01:13

    Punca ralat adalah seperti yang dinyatakan di atas
    Penyelesaian
    Susun semula sebelum dan sekarang dahulu dan kemudian tukarkannya ke dalam set perbandingan
    Kaedah penyusunan semula

    .
    reduce(lambada prev,next:prev.append(next['UserName']),before,[])
    reduce(lambada prev,next:prev.append(next['UserName']),now,[])

    Perkara di atas menganggap bahawa perkara yang ingin anda tapis ialah nama pengguna

    balas
    0
  • 怪我咯

    怪我咯2017-04-18 10:01:13

    Cuba ini

    
    expected = [ l for l in before if l not in now ]

    balas
    0
  • Batalbalas