基于anoth删除一个字典中的某些元素

2024-10-02 20:44:22 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有两本这样的字典。在

a  = {'file1': [('1.txt', 1.0),
                ('3.txt', 0.4),
                ('2.txt', 0.3)],
      'file2': [('1.txt', 0.5),
                ('2.txt', 0.2),
                ('3.txt', 1.0)]}

b =  {'file1': [('1.txt', 9),
                ('2.txt', 1),
                ('3.txt', 5),
                ('4.txt', 4)],
      'file2': [('1.txt', 0),
                ('2.txt', 2),
                ('3.txt', 3),
                ('4.txt', 0)]}

我编写了一个函数来根据字典a过滤字典b

函数的预期结果如下:

^{pr2}$

到目前为止,我已经编写了一个函数,但它的输出不是我想要的那个。在

def filter():
    c = {file1:set((txt1,value2)
               for file1,dic1 in a.items()
               for file2,dic2 in b.items()
               for txt1,value1 in dic1
               for txt2,value2 in dic2
               if txt1 == txt2 and file1 == file2)
         for file1,dic1 in a.items()}

    pp({k:v for k,v in c.items()})

现在输出如下所示:

{'file1': {('1.txt', 0),
           ('1.txt', 9),
           ('2.txt', 1),
           ('2.txt', 2),
           ('3.txt', 3),
           ('3.txt', 5)},
 'file2': {('1.txt', 0),
           ('1.txt', 9),
           ('2.txt', 1),
           ('2.txt', 2),
           ('3.txt', 3),
           ('3.txt', 5)}}

我不知道哪里出了问题。 任何帮助都将不胜感激。在


Tags: 函数intxtfor字典defitemsfile1
3条回答

我也是一个新手,我的答案没有以前那么好,但是因为我花了一些时间来解决这个问题:)我的代码是

from collections import defaultdict

def f(data, flt):
    newflt = {}
    for k, v in flt.items():
        newflt[k] = map(lambda t: t[0], v)
    outd = defaultdict(list)
    for k, v in data.items():
        fv = newflt[k]
        for t in v:
            if t[0] in fv:
                outd[k].append(t)
    return outd

如果只希望在具有不常用键的地方保留具有公共值的公共键:

print({k:[v for v in val if v[0] in {x[0] for x in a[k]}] for k, val in b.items() if k in a})

{'file2': [('1.txt', 0), ('2.txt', 2), ('3.txt', 3)], 'file1': [('1.txt', 9), ('2.txt', 1), ('3.txt', 5)]}

如果您有不常用的键,并且还希望保留这些键和值:

^{pr2}$

如果您想实际过滤原始dict:

for k, val in b.items():
    b[k] = [v for v in val if v[0] in {x[0] for x in a[k]}]

print(b)

或者使用dict comp创建一个新dict,如果所有键都是公共的:

print({k:[v for v in val if v[0] in {x[0] for x in a[k]}]  for k, val in b.items()})

{'file2': [('1.txt', 0), ('2.txt', 2), ('3.txt', 3)], 'file1': [('1.txt', 9), ('2.txt', 1), ('3.txt', 5)]}

最原始的dict过滤将是最有效的。在

您可以将^{}用于以下任务:

>>> from collections import defaultdict
>>> d=defaultdict(list)
>>> for k,v in b.items():
...      for i in v:
...         if i[0] in zip(*a[k])[0]: #in python 3 next(zip(*a[k]))
...              d[k].append(i)
... 
>>> d
defaultdict(<type 'list'>, {'file2': [('1.txt', 0), ('2.txt', 2), ('3.txt', 3)], 'file1': [('1.txt', 9), ('2.txt', 1), ('3.txt', 5)]})

注意为了检查a中是否存在b值,可以使用zip函数获取文件名!在

另外,您还可以使用dict.setdefault() method

^{pr2}$

注意:如果您使用python3作为zip函数返回一个生成器,则无法对其进行索引,因此需要将zip(*a[k])[0]:更改为next(zip(*a[k])):

相关问题 更多 >