当且仅当在另一个列表中找到该字典键的所有值时,才将该字典的键附加在列表中

时间:2018-11-11 13:00:53

标签: python

L = [ ]
a ={ 'A1' : [ 'A'] }
b = { 'A' : [ 'a1', 'a2'] , 'a1' : ['a11' , 'a12'] }
c = [  'a11.txt' , 'a3.txt' ]

我的条件:

  • 如果在c中找到A,则在L中附加A1
  • 如果找到a1和a2,则在L后面附加A
  • 如果找到a1而没有找到a2,则A不应附加到L
  • 如果对于键a1的值来说,如果找到a11而没有找到a12,则a1不应追加到列表L中,并且此条件的结果将为空列表。
  • 如果在c中找到了所有值,如a1,a2,a11和a12,则键a1,A和A1应该附加到列表L。

下面是我的代码:

for k,v in a.items():
    for element in v:
        if element +'.txt' in c :
            L.append(k)
        else:
            for k1,v1 in b.items():
                if element == k1:
                    for element1 in v1:
                        if element1+'.txt' in c:
                            L.append(k1)
                        else:
                            for k1,v1 in b.items():
                                if element1 == k1 :
                                    for element2 in v1 :
                                        if element2+'.txt' in c :
                                            L.append(k1)

我想要的结果应该是L = [ ] 但是我得到L = [ 'a1' ]

1 个答案:

答案 0 :(得分:0)

这有效:

a = {'A1': [ 'A']}
b = {'A': ['a1', 'a2'], 'a1': ['a11' , 'a12']}

a.update(b)

c = ['a11.txt', 'a1.txt', 'a2.txt', 'A.txt'] 
c = [x[:-4] for x in c]

L = [k for k, v in a.items() if all(x in c for x in v)]  
print(L)
# ['A1', 'A']

不需要两个字典。我合并了它们(或者如果可以先使用Single,那会更好),并过滤c列表以删除'.txt'部分。

然后,我们遍历字典并检查过滤列表中是否存在所有值。