Python 对字典中的值执行循环移位
我必须建立一个像这样的大字典Python 对字典中的值执行循环移位,python,dictionary,Python,Dictionary,我必须建立一个像这样的大字典 {'A' : {'A' : 1, 'B' : 0, 'C' : 0}, 'B' : {'A' : 0, 'B' : 1, 'C' : 0}} ............................ 每个内部字典移动一个位置。有没有办法让这个过程自动化 我可以循环使用np.roll()函数,如果它是ndarray,那么我想知道我是否可以用字典做类似的事情 这将在r中创建字符串: import string r = {} a = [1] + [0] * 25 f
{'A' : {'A' : 1, 'B' : 0, 'C' : 0},
'B' : {'A' : 0, 'B' : 1, 'C' : 0}}
............................
每个内部字典移动一个位置。有没有办法让这个过程自动化
我可以循环使用
np.roll()
函数,如果它是ndarray
,那么我想知道我是否可以用字典做类似的事情 这将在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
奖金一行
如果您使用的是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}
还有另一个解决方案
解决方案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
您可以使用快速字典值(列表)移位(dequerotate
function),但字典没有特定的功能,您应该自己制作,例如:
# 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))
演示:
可能使用deque而不是python,字典被实现为哈希表,并且是无序的。所以,你的“立场”毫无意义。你是说收集。订购的信息吗?@utdemir在这里不是毫无意义的。他是根据键旋转值的。那么,我们假设键是按自然字母顺序排列的吗?不,我只是编了一个例子来说明我的问题。键是字符串
>>> 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}}