2014-10-06 1 views
0

У меня возникли проблемы с сопоставлением вложенного списка со словарем с несколькими значениями. Словарь и вложенный список, как так:Python: сравнение вложенных списков и словарей

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

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

Я хочу, чтобы создать массив, где каждый подсписок («а», «б», «с & d», «е & е & г») является по сравнению с каждым значением, и если какой-либо элемент в подсписке является членом этого значения, он создает запись 0, иначе создается 1 запись.

[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 
+0

Обратите внимание, что словари не упорядочены. Похоже, что вы хотите, чтобы получившийся список упорядочивался естественным путем на клавишах dict, но было бы полезно указать это явно. –

ответ

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

Здесь вы идете: (я переименовал вход в ЛСТ и 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

+1 Хорошо сжатый и читаемый. –

+0

Я был очень удивлен тем, насколько похожими решениями были. –