在python中如何将字典的值分组并分配到单个键中

在python中如何将字典的值分组并分配到单个键中,python,Python,我有英特尔十六进制文件的内存 1879048192: 4, 1879048193: 3, 1879048194: 2, 1879048195: 1, 1879048196: 4, 1879048197: 3, 1879048198: 2, 1879048199: 1, 1879048200: 4, 1879048201: 3, 1879048202: 2, 1879048203: 1, 1879048204: 4, 1879048205: 3, 1879048206: 2, 1879048207

我有英特尔十六进制文件的内存

1879048192: 4,
1879048193: 3,
1879048194: 2,
1879048195: 1,
1879048196: 4,
1879048197: 3,
1879048198: 2,
1879048199: 1,
1879048200: 4,
1879048201: 3,
1879048202: 2,
1879048203: 1,
1879048204: 4,
1879048205: 3,
1879048206: 2,
1879048207: 1,
我想要

1879048192: 1234(with swapping),
1879048196 :1234
1879048200 :1234
1879048204 :1234
1879048208 :1234
我使用

for x in range (0,count):
    for i in range(0,4):
        realdata = mapFile.values()[x:x+4]
        realdata[x+3],realdata[x+2],realdata[x+1],realdata[x+0] =                realdata[x+0],realdata[x+1],realdata[x+2],realdata[x+3]

        s = ''.join(map(str, realdata))

        realadr = mapFile.keys()[x] + offset

        offset = offset + 4

        _buf = {realadr : int(s)}
但我不能成功,我是python新手。请建议我更好的执行

_buf = {realaddr : int(s)}
使_buf成为一个只有一个条目的字典,即realaddr:int(s)的最后一个值。那不是你想要的。将其移到外部,并添加用于合并值的逻辑:

_buf = {}
for x in range (0,count):
    for i in range(0,4):
        realdata = mapFile.values()[x:x+4]
        realdata[x+3],realdata[x+2],realdata[x+1],realdata[x+0] =                realdata[x+0],realdata[x+1],realdata[x+2],realdata[x+3]

        s = ''.join(map(str, realdata))

        realadr = mapFile.keys()[x] + offset

        offset = offset + 4

        if realadr in _buf:
           # merge the values somehow
           s = _buf[realadr] + s

        _buf[realadr] = int(s)

print _buf

根据需要,在for循环中使用mapfile.keys()重写。我使用generator对象强制执行步骤4。您希望一次处理四个字节,因此每次必须向前跳四个字节,然后在循环中向前看以获得mapfile[x+3]

您会注意到,为了演示代码如何处理这些错误,我特意在映射文件中添加了一些错误

mapfile = {
    1879048192: 0,
    1879048193: 0,
    1879048194: 0,
    1879048195: 0,
    1879048196: 4,
    1879048197: 3,
    1879048198: 2,
    1879048199: 17,
    1879048200: 0,
    1879048201: 1,
    1879048202: 0,
    1879048203: 0,
    1879048204: 4,
    # intentionally missing byte
    1879048206: 2,
    1879048207: 1,
    1879048208: 0 # single byte cannot make up a dword
}

_buf = {}
for x in (x for x in mapfile.keys() if 0==x%4):
    try:
        s = "0x{0:02x}{1:02x}{2:02x}{3:02x}".format(mapfile[x+3],mapfile[x+2],mapfile[x+1],mapfile[x+0])
        print "offset ", x, " value ", s
        _buf[x] = int(s, 16)
    except KeyError as e:
        print "bad key ", e

print "_buf is ", _buf
输出:

offset  1879048192  value  0x00000000
offset  1879048196  value  0x11020304
offset  1879048200  value  0x00000100
bad key  1879048205
bad key  1879048211
_buf is  {1879048192: 0, 1879048200: 256, 1879048196: 285344516}

“交换”是什么意思?输入文件第一列中的数字是否总是连续整数?输入文件第二列中的数字是否始终为4,3,2,1,4,3,2,1。。。?为什么输出中的第一行在冒号之后有空格,而所有其他行在冒号之前有空格?您好,欢迎使用StackOverflow。请花些时间阅读帮助页面,特别是命名和的部分。更重要的是,请阅读。你可能还想了解。我想要1879048192:41879048193:31879048194:219879048195:11879048192:12341879048195[valueof1879048195]2[valueof1879048194]3[valueof1879048193]4[valueof1879048191]因为我正在把大端系统转换成小端系统。请帮忙。我的第一个建议是用两位数的十六进制数来表示每个字节。否则,在连接它们时,您将有放置错误。它会导致此错误realdata[x+3]、realdata[x+2]、realdata[x+1]、realdata[x+0]=realdata[x+0]、realdata[x+1]、realdata[x+2]、realdata[x+3]Indexer:列表索引超出范围,我正在使用此交换列表中的变量。@Sandy这是您的代码。我以为你知道你在那里干什么。请随意将其替换为在最终词典中构建您想要的键/值的任何内容(例如,应该给出realaddr=1879048207和s=“1”)。我也需要这方面的帮助,请您推荐一些内容。但这违背了我的目的,如果我这样做,就没有给出正确的地址_buf={}范围内的x(offset,offset+count,4):realdata=mapFile.values()s=“{0:02x}{1:02x}{2:02x}{3:02x}”。格式(realdata[x+3],realdata[x+2],realdata[x+1],realdata[x+0])#打印“offset”,x,“value”,s#可选用于调试_buf[x]=s pprint(_buf)我所做的是对的吗?但是我想要32位地址,它只提供16位地址谢谢@Kenny Ostrom,addresses=mapFile.keys()I=0 val32=0地址输入地址:如果I==4:print hex(val32)val32=0 I=0 addr32=addr&0xFFFFFFFC offset=addr-addr32 value=mapFile[addr]val32=val32 |(用于对齐的值,您希望从dword边界开始。这意味着起始地址满足以下条件:地址%4==0,其中地址是字节偏移量。对于结束情况,如果在结尾处有一些字节数不完全是4,则必须丢弃它们,或假定剩余字节为0。您只能使用f。)一次处理我们的字节,而不获取索引超出范围的异常。或者,您可以在循环中检测此情况,而不是尝试修剪或填充,以便只处理所有4个字节可用的地址,或者捕获异常并忽略它。如果逐字节数据映射缺少任何条目,也将触发索引超出范围e异常,我认为应该通过一条适当的消息使整个操作失败。但是您可以在_buf输出中跳过该地址。