Python:嵌套列表和字典比较
我无法将嵌套列表与多个值的字典进行比较。 字典和嵌套列表是像这样:Python:嵌套列表和字典比较
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条目,否则创建1条目。因为'a'只在adv0,[0,1,1]中,因为'b'只在adv0,[1,0,0]中,因为adv1和adv2包含'c',因此'a'仅在adv0,[0,1,1]中。[0121] '或'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
的一个问题是字典是无序的,所以你指望你可能无法通过按键进行迭代。使用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]
在这里你去:(我改名为输入LST和DCT,以避免与内置list
和dict
对象发生冲突)
[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分钟太晚了...)
+1良好压缩,仍然可读。 – 2014-10-06 21:21:56
我很惊讶类似的解决方案。 – 2014-10-06 21:24:23
请注意,词典没有排序。这听起来像你想要的结果列表按自然排序的字典键排序 - 但它是很好的明确提到。 – 2014-10-06 21:03:52