2013-07-17 2 views
1

У меня есть словарь, состоящий из ключа: [список], в котором список является фиксированным и даже число двоичных значений, то есть:Python: вычислить значение для каждой пары значений в списке

{'a':[0,1,1,0,0,1],'b':[1,1,1,0,0,0]} 

Для каждого key, мне нужно вернуть новое значение для каждой пары значений в исходном dict, так что для пары (1,1) = 3 пара (0,1) = 2, пара (1,0) = 1 , пара (0,0) = 0.

для приведенного выше примера, результат будет:

{'a':[2,1,2],'b':[3,1,0]} 

Новые и для python, и для программирования в целом, и не нашли того, что я ищу на SO. Предложения оценены.

ответ

1

Первая атака только часть спаривание:

def paired(binlist, map={(1, 1): 3, (0, 1): 2, (1, 0): 1, (0, 0): 0}): 
    return [map[tuple(binlist[i:i + 2])] for i in range(0, len(binlist), 2)] 

Затем применить это к словарю:

{k: paired(v) for k, v in input_dictionary.iteritems()} 

Демо:

>>> paired([0,1,1,0,0,1]) 
[2, 1, 2] 
>>> paired([1,1,1,0,0,0]) 
[3, 1, 0] 
>>> input_dictionary = {'a':[0,1,1,0,0,1],'b':[1,1,1,0,0,0]} 
>>> {k: paired(v) for k, v in input_dictionary.iteritems()} 
{'a': [2, 1, 2], 'b': [3, 1, 0]} 
+0

Спасибо! Прекрасно работает. – Thain

0

Небольшой фрагмент кода я мог придумать было :

>>> testDict = {'a':[0,1,1,0,0,1],'b':[1,1,1,0,0,0]} 
>>> referenceDict = {(0, 1):2, (0, 0):0, (1, 0):1, (1, 1):3} 
>>> for key, value in testDict.items(): 
     finalList = [referenceDict[elem] for elem in zip(value[::2], value[1::2])] 
     testDict[key] = finalList  
>>> testDict 
{'a': [2, 1, 2], 'b': [3, 1, 0]} 

value[::2] является Python's Slice Notation.

Упаковка это вверх в функцию для использования:

def testFunction(inputDict): 
    referenceDict = {(0, 1):2, (0, 0):0, (1, 0):1, (1, 1):3} 
    for key, value in inputDict.items(): 
     finalList = [referenceDict[elem] for elem in zip(value[::2], value[1::2])] 
     inputDict[key] = finalList 
    return inputDict 

Пример -

>>> testFunction({'a':[0,1,1,0,0,1],'b':[1,1,1,0,0,0]}) 
{'a': [2, 1, 2], 'b': [3, 1, 0]} 
0
>>> D = {'a': [0, 1, 1, 0, 0, 1],'b': [1, 1, 1, 0, 0, 0]} 
>>> {k: [v[i] + 2 * v[i+1] for i in range(0, len(v), 2)] for k, v in D.items()} 
{'a': [2, 1, 2], 'b': [3, 1, 0]}