对字典中的值执行循环移位

时间:2014-01-15 13:50:18

标签: python dictionary

我必须构建一个看起来像这样的大字典

{'A' : {'A' : 1, 'B' : 0, 'C' : 0}, 
'B' : {'A' : 0, 'B' : 1, 'C' : 0}} 
............................

每个内部字典移动一个位置。有没有办法让这个过程自动化。

我可以循环并使用np.roll()函数,如果它是ndarray,那么我想知道我是否可以用字典做类似的事情。

3 个答案:

答案 0 :(得分:3)

您可以使用collections.deque进行快速字典值(列表)移位(deque rotate函数)但是字体没有特定功能,您应该自己制作,例如:

# shift dct (dict) values by n to right if n is positive
# and to left if n is negative; returns new dictionary
def dict_roll(dct, n):
    shift_values = deque(dct.values())
    shift_values.rotate(n)
    return dict(zip(dct.keys(), shift_values))

演示:

>>> d = {'A': {'A': 1, 'C': 0, 'B': 0}, 'B': {'A': 0, 'C': 0, 'B': 1}}
>>> for k in d:
...     d[k] = dict_roll(d[k], 1)
... 
>>> d
{'A': {'A': 0, 'C': 1, 'B': 0}, 'B': {'A': 1, 'C': 0, 'B': 0}}
>>> for k in d:
...     d[k] = dict_roll(d[k], 1)
... 
>>> d
{'A': {'A': 0, 'C': 0, 'B': 1}, 'B': {'A': 0, 'C': 1, 'B': 0}}

答案 1 :(得分:0)

这将在r

中创建您的字符串
import string
r = {}
a = [1] + [0] * 25
for i in string.ascii_uppercase:
     r[i] = dict(zip(string.ascii_uppercase,a))
     a = a[-1:] + a[:-1]
print r

Bonon one-liner

如果您使用的是Python 2.7+或Python 3,那么您可以使用字典理解获得单行代码:

import string
{i:{j:1 if i==j else 0 for j in string.ascii_uppercase} for i in string.ascii_uppercase}

答案 2 :(得分:0)

另一种解决方案。

解决方案1:

out = dict()
syms = ['A', 'B', 'C']

for sym_outer in syms:
    inner_dict = dict()
    for sym_inner in syms:
        inner_dict[sym_inner] = 0 if sym_inner != sym_outer else 1
    out[sym_outer] = inner_dict

解决方案2:

这是一个部分解决方案,但你得出['A'] ['A'] == 1并且输出['A'] ['B'] == 0。

from collections import defaultdict

out = defaultdict(lambda: defaultdict(int))

for sym in ['A', 'B', 'C']:
    out[sym][sym] = 1