Python:嵌套列表和字典比较

时间:2014-10-06 20:50:44

标签: python dictionary nested-lists

我在将嵌套列表与多个值的字典进行比较时遇到问题。 字典和嵌套列表是这样的:

list = [[['a']], [['b']], [['c'], ['d']], [['e'], ['f'], ['g']]]

dict = {'adv0' : ('a', 'b'), 'adv1' : ('f', 'c'), 'adv2' : ('d', 'e', 'q')}

我想创建一个数组,其中每个子列表('a','b','c& d','e& f& g')与每个值进行比较,如果子列表中有任何项目是该值的成员,它创建一个0条目,否则它创建一个条目。

[0,1,1]因为'a'仅在adv0,[0,1,1]中,因为'b'仅在adv0,[1,0,0]中,因为adv1和adv2包含'c'或'd',[1,0,0],因为adv1和adv2包含'e','f'或'g'之一。因此我们得到数组[0,1,1,0,1,1,1,0,0,1,0,0]。

以下代码是我对解决方案的可怕尝试:

l = []
for sublist in list:
      for items in sublist:
        for x in items:
          for key in dict:
            if x in dict[key]:
              l.extend('0')
            elif x not in dict[key]:
              l.extend('1')
print l

2 个答案:

答案 0 :(得分:1)

一个问题是词典是无序的,因此您可能无法按预期迭代键。使用OrderedDict或专门通过您想要的键进行迭代。这有效:

L = [[['a']], [['b']], [['c'], ['d']], [['e'], ['f'], ['g']]]
D = {'adv0' : ('a', 'b'), 'adv1' : ('f', 'c'), 'adv2' : ('d', 'e', 'q')}

l = []
for sublist in L:
    for key in ('adv0','adv1','adv2'):
        if any(item[0] in D[key] for item in sublist):
            l.append(0) # changed to give explicit output you listed.
        else:
            l.append(1) # ditto
print l

输出:

[0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0]

答案 1 :(得分:1)

在这里:(我将输入重命名为lst和dct以避免与内置listdict对象发生冲突)

[0 if any(v[0] in dct[k] for v in sublst) else 1 
   for sublst in lst 
     for k in sorted(dct.keys())]

这很有趣。 (但遗憾的是,3分钟太晚了......)